2012-09-07 112 views
5

從我的Django應用程序,如何將用戶重定向到somescheme://someurl.com?Django重定向到自定義URL

爲了給你一些上下文以防萬一它有幫助,我有一個用Python/Django編寫的工作oauth2服務器,我需要允許用戶註冊具有自定義URL方案的redirect_uris。此自定義網址方案用於handling the redirect within native apps

我的第一反應是使用HttpResponseRedirect,但這個URL有一個自定義的方案,並不是HTTP,所以我猜這不是我想要的。預先感謝您提供的任何建議。

編輯: 我沒有試過這個,Django正確地返回響應重定向而沒有拋出錯誤,但瀏覽器不重定向到這個URL。我正在使用Chrome來測試它。編輯2: HttpResponseRedirect在Safari瀏覽器中正常工作。

+1

你試過了嗎?重定向響應返回給客戶端,因此它可能正常工作。 – zmbq

回答

4

類HttpResponseRedirect

需要構造函數的第一個參數 - 路徑來重定向。這可以是完全合格的URL(例如'http://www.yahoo.com/search/')或絕對路徑(沒有>域)(例如'/ search /')。有關其他可選的構造函數參數,請參閱HttpResponse。注>這將返回一個HTTP狀態代碼302

這就是從這裏開始: https://docs.djangoproject.com/en/dev/ref/request-response/

應該從我讀什麼反正工作。

+0

是的,重定向在Safari中正常工作。謝謝! – Spike

16

這實際上不應工作作爲Django是隻允許重定向到httphttpsftp默認情況下,出於安全方面的原因:

https://www.djangoproject.com/weblog/2012/jul/30/security-releases-issued/

我是有OAuth的同樣的問題,並重定向到自定義方案。
Django(在Apache上)在重定向到自定義方案時拋出500的(django.core.exceptions.SuspiciousOperation)。解決方案是創建自己的HttpResponseRedirect子類或只是:

location = < your redirect URL > 
res = HttpResponse(location, status=302) 
res['Location'] = location 
return res 
+0

感謝您的領導!我還沒有嘗試過,但如果我這樣做,它會標記它正確。我在Django 1.4.0上,這可能是爲什麼我沒有注意到這個問題。 – Spike

+0

就像一個魅力 - 完美的內部/關閉項目。 – Thomas

+0

爲了增加這一點,我發現(對於Django 1.6),如果你繼承了'HttpResponseRedirect',你還需要將你的自定義協議添加到'allowed_schemes'類變量中,否則Django仍然會引發'SuspiciousOperation' –