自定义中间件
在项目下创建一个session_cache.py
文件
from django.utils.deprecation import MiddlewareMixin
from django.core.cache import cache
class SessionCacheMiddleware(MiddlewareMixin):
def __init__(self, get_response=None):
super().__init__(get_response)
self.SCM = 'SessionCacheMiddleware:'
self.KEY = 'django.contrib.sessions.cache'
def process_request(self, request):
# 验证session是否存在,验证通过则判断session是否是同一个用户同一个客户端登录
try:
session_key = self.KEY + request.session.session_key # 本次登录的session_key
_auth_user_id = self.SCM + request.session.get('_auth_user_id', None) # 组合用户id
except TypeError:
return
else:
_auth_user_id_key = cache.get(_auth_user_id, None)
# 判断用户id在缓存中是否存在
if _auth_user_id_key:
# 判断缓存中session名称和用户id记录的名称是否相同,如果相同直接返回一个空值不做任何操作。
if _auth_user_id_key in session_key:
time = request.session.get_expiry_age() #获取
cache.touch(_auth_user_id, time) # 更新过期时间session过期时间
else:
cache.delete(_auth_user_id_key) # 删除上一次用户登录的session
cache.set(_auth_user_id, session_key) # 为session 和同一个用户名做标记
else:
cache.set(_auth_user_id, session_key)
编辑settings.py
文件加入刚刚自定义中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 下面这个就是我们定义好的中间件了
'qincheng.session_cache.SessionCacheMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
发表评论
共 0 条评论
暂无评论