django的session机制详解

Session的初始化,保存,删除,验证前言运行环境Session的初始化(SessionMiddleware中间件)Session的验证(AuthenticationMiddleware中间件)Session对应数据库的数据加载、验证当前登录的User对象Session的保存,回写到客户端(SessionMiddleware中间件)Session的删除对于首次登录的用户前言面向需要验证用户合...
摘要由CSDN通过智能技术生成

前言

面向需要验证用户合法性的项目,如果不涉及用户验证,系统不会将session存入数据库。

运行环境

  • python 3.7.5
  • django 2.2.7

Session的初始化(SessionMiddleware中间件)

django.contrib.sessions.middleware.SessionMiddleware是django处理session的中间件,负责对session进行初始化,以及保存更新session。sessions\middleware.py这个文件代码不长,也就70多行,建议读一下。

class SessionMiddleware(MiddlewareMixin):
	# 初始化中间件,指定session使用的引擎
	# 默认为django.contrib.sessions.backends.db.SessionStore
    def __init__(self, get_response=None):
        self.get_response = get_response
        engine = import_module(settings.SESSION_ENGINE)
        self.SessionStore = engine.SessionStore
	# 根据cookie中sessionid的值初始化session,这时的session并没有和数据库的数据关联
	# settings.SESSION_COOKIE_NAME为字符串'sessionid'
    def process_request(self, request):
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
        request.session = self.SessionStore(session_key)
	# 新增、更新session到数据库
    def process_response(self, request, response):
    	......

Session的验证(AuthenticationMiddleware中间件)

Session对应数据库的数据

django.contrib.auth.middleware.AuthenticationMiddleware,负责从request.session中找出登录的user,我们一步步看看它是怎么做的。

首先是auth\middleware.py中间件代码

from django.contrib import auth

def get_user(request):
    if not hasattr(request, '_cached_user'):
        request._cached_user = auth.get_user(request)
    return request._cached_user


class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
        assert hasattr(request, 'session'), (
            "The Django authentication middleware requires session middleware "
            "to be installed. Edit your MIDDLEWARE%s setting to insert "
            "'django.contrib.sessions.middleware.SessionMiddleware' before "
            "'django.contrib.auth.middleware.AuthenticationMiddleware'."
        ) % ("_CLASSES" if settings.MIDDLEWARE is None else "")
        request.user = SimpleLazyObject(lambda: get_user(request))

通过下面这行代码,获取了当前登录的user

from django.contrib import auth

request._cached_user = auth.get_user(request)

继续往下走
auth\__init__.py 回到跳转前的地方

def get_user(request):
    """
    Return the user model instance associated with the given request session.
    If no user is retrieved, return an instance of `AnonymousUser`.
    """
    from .models import AnonymousUser
    user = None
    try:
        user_id = _get_user_session_key(request)
        # BACKEND_SESSION_KEY = '_auth_user_backend'
        backend_path = request.session[BACKEND_SESSION_KEY]
    except KeyError:
        pass
    else:
        if backend_path in settings.AUTHENTICATION_BACKENDS:
            backend = load_backend
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值