Django HTTP\u REFERER引用了不正确的pag

2024-03-28 18:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个django应用程序,它包含一个来自homepage的链接,链接到View1,重定向到View2应该重定向回View1。但是,View2中的HTTP_REFERER头将homepage视为referer,而不是View1。你知道吗

主页模板

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

登录视图

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指向LoginView而不是主页?你知道吗


Tags: thetotestgthttpreturnrequestsession
1条回答
网友
1楼 · 发布于 2024-03-28 18:32:42

HTTP标准中没有规定重定向后HTTP_REFERER应该发生什么,因此您的代码将依赖于浏览器。而且,HTTP_REFERER并不总是受到尊重/支持。你知道吗

从您的代码看来,您可以直接重定向到URL:

return redirect('login')

但我想你还想处理其他的案子。你知道吗

最好在URL中添加一个查询字符串,例如:

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

或者对现代Python更好一点:

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

在captcha视图中:

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

相关问题 更多 >