django中session的底层原理
django中的session的底层原理在中间件SessionMiddleware
中,session的使用很简单,
# 设置session
request.session['k1']
# 获取session
request.session.get('k1', None)
但是在设置和获取的背后,django在中间件中做了很多工作。
设置session后,响应走的时候
# django内部产生一个随机字符串
# 操作django_session表(就是存session的地方,也可以是其他文件、内存、数据库等)
# 给客户端返回一个名为sessionid的随机字符串cookie
在中间件SessionMiddleware的process_response()方法内,
首先取出request.session的modify属性,判断是否是true,如果是true,表示在视图函数中修改过session,数据库同步修改;
如果是false,就不修改,返回给前端sessionid:随机字符串;
获取session,请求来的时候
# 自动从浏览器请求中获取sessionid对应的随机字符串
# 拿着该随机字符串去django_session表中查找对应的数据
# 如果比对上了,则将对应的数据取出并以字典的形式封装到request.session中;如果比对不上 则request.session.get()返回的是None
在中间件SessionMiddleware的process_request()方法内,
通过sessionid获取水机字符串,拿这个随机字符串查找存放session的数据库表,
将查找到的session字典结果存放在request.session中
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
request.session = self.SessionStore(session_key)