Django HTTP_REFERER指向错误的页面

时间:2019-01-31 20:52:29

标签: python django http

我有一个Django应用,其中包含来自homepage的链接,该链接链接到View1,该链接重定向到View2,并且应该重定向回到{{1 }}。但是,View1中的HTTP_REFERER标头将View2视为引用者,而不是 homepage

首页模板

View1

登录视图

...
<!-- This links to the LoginView -->
<a href="{% url 'login' %}">Login</a>
...

create_captcha视图

class LoginView(views.View):
    def dispatch(self, request, *args, **kwargs):
        if not request.session.test_cookie_worked():
            request.session.set_test_cookie()
            # This redirects to the create_captcha view
            return redirect(reverse('create_captcha'))

        return super().dispatch(request, *args, **kwargs)

预期的行为:def create_captcha(request): if not request.session.test_cookie_worked(): return render("Please enable cookies and try again.") # This SHOULD redirect to LoginView but instead redirects to the homepage. return redirect(to=request.META.get('HTTP_REFERER')) -> homepage link-> LoginView-> create_captcha

实际行为:LoginView-> homepage link-> LoginView-> create_captcha

问题:如何使homepage指向HTTP_REFERER而不是首页?

1 个答案:

答案 0 :(得分:0)

HTTP标准中没有任何内容说明重定向后HTTP_REFERER应该发生什么,因此您的代码将依赖于浏览器。另外,HTTP_REFERER并不总是受到尊重/启用。

从您的代码中,您似乎可以直接直接重定向到URL:

return redirect('login')

但我认为您想处理其他一些情况。

最好在网址上添加查询字符串,例如:

return redirect(reverse('create_captcha') + '?next=' + reverse('login')

或者在现代Python上更好一点:

return redirect(f"{reverse('create_captcha')}?next={reverse('login')}")

在验证码视图中:

return redirect(request.GET['next'])