首页 > 解决方案 > Django HTTP_REFERER 引用了错误的页面

问题描述

我有一个 django 应用程序,其中包含来自该homepage链接的链接,该链接View1重定向到View2并且应该重定向回View1. 但是,HTTP_REFERER标头中View2homepage引用者而不是 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)

create_captcha 视图

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而不是主页?

标签: pythondjangohttp

解决方案


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')}")

在验证码视图中:

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

推荐阅读