2012-09-07 115 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' –