自定义中间件

在项目下创建一个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',
]