Django应用如何实现页面刷新时自动触发用户登出功能?
实现Django页面刷新自动登出功能的步骤
核心实现逻辑使用Django全局中间件,所有请求触发时自动执行登出逻辑,覆盖全应用所有页面场景:
步骤1:创建自定义中间件
在你的应用目录下新建middleware.py文件,写入如下代码:
from django.contrib.auth import logout from django.urls import resolve class AutoLogoutOnRefreshMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 排除登录接口的POST请求,避免刚登录就被登出 current_url = resolve(request.path_info).url_name if not (request.method == 'POST' and current_url == 'login'): if request.user.is_authenticated: logout(request) response = self.get_response(request) return response
步骤2:注册中间件
打开项目settings.py文件,找到MIDDLEWARE配置项,将刚才写的中间件添加到列表末尾,注意要放在django.contrib.sessions.middleware.SessionMiddleware和django.contrib.auth.middleware.AuthenticationMiddleware之后:
MIDDLEWARE = [ # 原有默认中间件保持不变 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # 其他原有中间件... # 新增你的自定义中间件,替换为你实际的应用名 '你的应用名.middleware.AutoLogoutOnRefreshMiddleware', ]
步骤3:修复现有登录视图的问题
你当前的Login视图存在两处逻辑错误需要修正:
- 登录验证成功后跳转逻辑错误,当前返回的仍是登录页
- 登录失败分支逻辑缺失,
error变量未定义
修正后的代码参考:
def Login(request): if request.method == 'GET': if request.user.is_authenticated: logout(request) return render(request,'login.html') elif request.method == 'POST': username=request.POST['username'] password=request.POST['password'] user = authenticate(username=username, password=password) if user is not None: login(request, user) # 登录成功跳转到首页 return redirect('home') else: # 登录失败返回错误提示 error = {"msg":"用户名或密码错误"} return render(request,'login.html',context=error)
完成以上配置后,用户登录后刷新任意页面都会被自动登出,跳转回登录页。
内容的提问来源于stack exchange,提问作者jay kishan
相关产品推荐
相关产品推荐

