Django中LoginRequiredMixin登录后重定向错误问题求助
Django登录后跳转回原受限页面的解决方案
问题说明
使用LoginRequiredMixin限制用户访问指定URL时,未登录用户会被重定向到登录页,URL中会携带next(或自定义的redirect_to)参数记录原访问地址,但登录成功后始终跳转到success_url设置的main页面,无法回到原页面。需要实现两种场景:
- 直接访问登录页:登录后跳转到
main - 从受限页面跳转登录:登录后跳转回原受限页面
解决思路
核心是在LoginView中重写get_success_url方法,优先读取请求中携带的跳转参数,验证安全性后跳转;如果没有有效跳转参数,再使用默认的success_url。
代码修改
1. 调整LoginView(核心修改)
在views.py中修改LoginView,添加get_success_url方法处理跳转逻辑:
from django.utils.http import is_safe_url from django.contrib.auth import login from django.views.generic.edit import FormView from django.urls import reverse_lazy class LoginView(FormView): form_class = LoginForm template_name = "tavern_app/login.html" success_url = reverse_lazy("main") # 如果使用自定义跳转参数名,这里要和LoginRequiredMixin保持一致,比如: # redirect_field_name = 'redirect_to' def form_valid(self, form): user = form.user login(self.request, user) return super().form_valid(form) def get_success_url(self): # 获取请求中的跳转参数 redirect_to = self.request.GET.get(self.redirect_field_name) # 验证跳转地址的安全性,防止恶意跳转 if redirect_to and is_safe_url( redirect_to, allowed_hosts=self.request.get_host(), require_https=self.request.is_secure() ): return redirect_to # 无有效跳转地址时,使用默认的success_url return super().get_success_url()
2. 配置LoginRequiredMixin(可选)
如果使用默认的next参数,CreateSessionBaseView无需修改:
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import View from django.shortcuts import render class CreateSessionBaseView(LoginRequiredMixin, View): login_url = '/log-in/' # 默认redirect_field_name为'next',可省略 # redirect_field_name = 'next' def get(self, request): return render(request, "tavern_app/create_session_base.html")
如果需要自定义跳转参数名(比如redirect_to),则同步修改CreateSessionBaseView:
class CreateSessionBaseView(LoginRequiredMixin, View): login_url = 'login' redirect_field_name = 'redirect_to' def get(self, request): return render(request, "tavern_app/create_session_base.html")
同时在LoginView中添加对应的redirect_field_name = 'redirect_to'属性。
原理说明
LoginRequiredMixin会将用户原本访问的受限页面地址,通过GET参数(默认next,可自定义)附加到登录页URL中- 重写
get_success_url后,登录成功时会优先检查该参数,若地址合法则跳转回原页面;否则使用预设的success_url跳转到main页面
内容的提问来源于stack exchange,提问作者selefotsifeM
相关产品推荐
相关产品推荐

