You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LoginRequiredMiddleware后,登录如何重定向至之前页面?

解决Django登录中间件重定向后next参数失效问题

1. 修改登录中间件,重定向时携带next参数

在middleware.py的process_view方法中,重定向到登录页时,将当前访问的路径作为next查询参数传递:

def process_view(self, request, view_func, view_args, view_kwargs):
    assert hasattr(request,'user')
    path = request.path_info.lstrip('/')
    print(path)
    
    if not request.user.is_authenticated:
        if not any(url.match(path) for url in EXEMPT_URLS):
            # 携带next参数重定向到登录页
            return redirect(f"{settings.LOGIN_URL}?next={request.path_info}")

2. 在登录模板中添加隐藏的next字段

在登录表单里加入隐藏输入框,把GET请求中的next值传递到POST请求里:

<form method="POST">
    {% csrf_token %}
    <!-- 账号、密码等表单字段 -->
    <input type="hidden" name="next" value="{{ request.GET.next }}">
    <button type="submit">登录</button>
</form>

3. 调整登录视图,兼容GET和POST的next参数

修改views.py中的login_user函数,优先从POST获取next,若没有则从GET获取,确保能拿到跳转前的路径:

def login_user(request):
    if request.user.is_authenticated:
        return redirect('list-venues')
    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            # 先取POST的next,再取GET的next
            next_param = request.POST.get('next') or request.GET.get('next')
            # 可选:校验next参数是否为本站安全路径,防止钓鱼跳转
            if next_param and next_param.startswith('/'):
                url = next_param
            else:
                url = reverse('list-venues')
            return redirect(url)
        else:
            messages.success(request,("There was an error, try again!"))
            return redirect('login_user')
    else:
        return render(request,'main/registration/login_user.html',{})

内容的提问来源于stack exchange,提问作者PhilM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:45:29