使用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
相关产品推荐
相关产品推荐

