Django重定向到自定义URL

7
从我的Django应用程序中,我如何将用户重定向到somescheme://someurl.com?为了帮助您理解情况,我编写了一个使用Python / Django编写的工作oauth2服务器,并且我需要允许用户注册具有自定义URL方案的redirect_uris。这个自定义URL方案用于{{link1:在本机应用程序中处理重定向}}。我的第一反应是使用HttpResponseRedirect,但是这个URL具有自定义方案并且不是HTTP,所以我猜这不是我想要的。非常感谢您能给出的任何建议。编辑:我确实尝试过这个方法,Django正确返回响应重定向而没有抛出错误,但浏览器没有重定向到此URL。我正在使用Chrome测试这个功能。编辑2:HttpResponseRedirect在Safari中运行良好。

1
你试过了吗?重定向响应返回到客户端,所以它可能会起作用。 - zmbq
2个回答

19

由于安全原因,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

谢谢提醒!我还没有尝试过,但如果我尝试并且有效,我会将其标记为正确的。我使用的是Django 1.4.0,这可能就是为什么我没有注意到这个问题的原因。 - Spike
仅补充一点,我发现(对于Django 1.6),如果你子类化HttpResponseRedirect,你还需要将你的自定义协议添加到allowed_schemes类变量中,否则Django仍然会引发SuspiciousOperation异常。 - Tom Dalton

3

class HttpResponseRedirect

构造函数的第一个参数是必需的,即要重定向到的路径。这可以是完全限定的URL(例如'http://www.yahoo.com/search/')或没有域名的绝对路径(例如'/search/')。有关其他可选的构造函数参数,请参见HttpResponse。请注意,这将返回HTTP状态代码302。

这来自于这里: https://docs.djangoproject.com/en/dev/ref/request-response/

从我所读的内容来看,它应该能够正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接