Django视图重定向外部域名失败,为何路径被追加至当前域名?
Django重定向外部域名失败的问题排查与解决
嗨,我来帮你搞定这个问题!你遇到的情况其实是Django对相对URL和绝对URL的处理逻辑导致的——当你只写google.com时,Django会把它当成当前域名下的相对路径,自然就会拼接到www.mydomain.com后面,变成www.mydomain.com/google.com,这肯定会404啦。
解决方法很简单:给URL加上完整的协议头(http/https)
不管用HttpResponseRedirect还是redirect(),只要把目标地址改成带https://的完整绝对URL就行:
用HttpResponseRedirect的修正代码:
class MyView(TemplateView): def get(self, request, *args, **kwargs): return HttpResponseRedirect('https://google.com')
用redirect()的修正代码(更推荐,Django的快捷函数更灵活):
from django.shortcuts import redirect class MyView(TemplateView): def get(self, request, *args, **kwargs): return redirect('https://google.com')
为什么会这样?
Django的重定向函数默认会把不带协议头的字符串解析为相对路径,也就是基于当前请求的域名来拼接。只有当字符串包含http://或https://时,它才会识别为外部绝对URL,直接跳转到目标网站。
另外,如果你需要动态处理外部域名,也可以把完整URL存在配置里,比如在settings.py里加:
EXTERNAL_REDIRECT_URL = 'https://google.com'
然后在视图里引用:
from django.conf import settings class MyView(TemplateView): def get(self, request, *args, **kwargs): return redirect(settings.EXTERNAL_REDIRECT_URL)
这样后续要修改目标地址时,直接改配置文件就行,不用动视图代码~
内容的提问来源于stack exchange,提问作者Nebulosar
相关产品推荐
相关产品推荐

