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)
posted @ 2020-07-01 19:29  the3times  阅读(487)  评论(0编辑  收藏  举报