如何阻止已认证用户访问登录页面?Django项目技术问询
解决已登录用户访问登录页自动跳转到仪表盘的问题
嘿,我来帮你搞定这个需求!要实现「用户登录后,不管是点击返回按钮还是手动输入accounts/login都停留在仪表盘」的效果,我们可以通过修改登录视图的逻辑来实现,下面是两种实用的方案:
方案一:自定义登录视图(推荐)
因为你用的是django-registration-redux,咱可以基于它依赖的Django自带登录视图,添加一个已认证判断的逻辑:
- 打开你的
signin/views.py,添加这个自定义类视图:
from django.contrib.auth.views import LoginView from django.shortcuts import redirect from django.conf import settings class CustomLoginView(LoginView): def dispatch(self, request, *args, **kwargs): # 先判断用户是否已经登录 if request.user.is_authenticated: # 已登录直接跳转到仪表盘 return redirect(settings.LOGIN_REDIRECT_URL) # 未登录则走正常的登录流程 return super().dispatch(request, *args, **kwargs)
- 接着修改根URL配置,把原来指向默认登录视图的
accounts/login换成咱刚写的自定义视图:
from django.urls import path from signin.views import CustomLoginView, user_sign urlpatterns = [ # 替换原登录URL的视图指向 path('accounts/login/', CustomLoginView.as_view(), name='login'), # 你的仪表盘视图 path('signin/user_sign/', user_sign, name='user_sign'), # 其他URL配置... ]
方案二:用视图包装器快速实现
如果不想写类视图,也可以用函数包装一下默认的登录视图,同样能达到效果:
- 在
signin/views.py里添加这个包装函数:
from django.contrib.auth.views import login as auth_login from django.shortcuts import redirect from django.conf import settings def protected_login(request, *args, **kwargs): # 已登录用户直接跳仪表盘 if request.user.is_authenticated: return redirect(settings.LOGIN_REDIRECT_URL) # 未登录用户走正常登录流程 return auth_login(request, *args, **kwargs)
- 然后修改URL配置,把
accounts/login指向这个包装函数:
from django.urls import path from signin.views import protected_login, user_sign urlpatterns = [ path('accounts/login/', protected_login, name='login'), path('signin/user_sign/', user_sign, name='user_sign'), # 其他URL配置... ]
额外说明
这两种方案都能完美实现你的需求:只要用户已经登录,不管是通过浏览器返回按钮还是手动输入登录页URL,都会自动跳转到你设置的LOGIN_REDIRECT_URL(也就是你的仪表盘页面/signin/user_sign/)。而且完全兼容你现有的django-registration-redux配置,不需要修改模板或者其他设置~
内容的提问来源于stack exchange,提问作者user7104029
相关产品推荐
相关产品推荐

