如何扩展django.contrib.auth视图?实现已登录用户登录页访问拦截
嗨,这事儿好办!咱们可以通过自定义登录视图来实现你要的逻辑,完全不用在模板里写判断代码。具体步骤如下:
第一步:在views.py中自定义登录视图
继承Django内置的LoginView,重写它的dispatch方法来提前判断用户状态:
from django.contrib.auth.views import LoginView from django.http import HttpResponseBadRequest from django.contrib import messages from django.shortcuts import redirect class CustomLoginView(LoginView): def dispatch(self, request, *args, **kwargs): # 先检查用户是否已登录 if request.user.is_authenticated: # 这里给你两种方案选: # 方案1:直接返回错误响应 return HttpResponseBadRequest("你已经处于登录状态,无法访问登录页面!") # 方案2:重定向到首页并弹出提示消息(推荐更友好的交互) # messages.error(request, "你已经登录啦,无需再次登录哦~") # return redirect('Homepage') # 如果是匿名用户,就走正常的登录流程 return super().dispatch(request, *args, **kwargs)
第二步:修改urls.py替换内置登录视图
把原来Django自带的login视图替换成咱们自定义的:
from django.conf.urls import url from django.contrib.auth import views as auth_views from . import views urlpatterns=[ url(r'^register/$', views.register, name='register'), url(r'^logout/$', auth_views.logout, {'next_page' : 'Homepage'}, name='logout'), # 替换为自定义的登录视图 url(r'^login/$', views.CustomLoginView.as_view(), name='login'), ]
为什么这么做?
dispatch方法是视图处理请求的入口,咱们在这里提前拦截已登录用户的请求——如果用户已经认证,直接返回错误或者重定向;如果是匿名用户,就交给父类的逻辑去渲染你已经配置好的login.html模板,完美符合你的需求!
对了,你原来放在/templates/registration下的login.html完全不用动,因为CustomLoginView继承了LoginView,默认会去找这个路径的模板。
内容的提问来源于stack exchange,提问作者Zahid Khan
相关产品推荐
相关产品推荐

