Django如何在后续请求中获取前序请求设置的session数据?
Django 跨请求读取session的实现原理
你修改request.session后能在后续请求读到值,本质是Django内置的SessionMiddleware在请求全链路自动完成了数据持久化、Cookie写入的工作,不需要你手动操作response对象。
整个完整流程如下:
- 请求进入Django后,
SessionMiddleware会优先于视图函数执行:它先从用户请求携带的Cookie中读取sessionid,去你配置的session存储后端(默认是Django自带的django_session数据库表)查询对应的数据,封装成可读写的request.session对象注入到请求中,再交给你的视图函数处理。 - 你在视图中对
request.session做的赋值、修改过期时间等操作,只会先修改这个内存对象的状态,不会立刻写入持久化存储。 - 视图执行完毕返回响应对象(就是你代码中最后return的
res)后,SessionMiddleware会执行后置处理逻辑:- 自动检测
request.session是否发生了修改,将最新的session数据同步写入持久化存储 - 如果是新生成的session(比如匿名用户第一次访问站点),会自动把新的
sessionid通过Set-Cookie响应头写入你返回的响应对象里,用户浏览器会自动保存这个Cookie。
- 自动检测
- 下次用户刷新页面发起新请求时,浏览器会自动把当前域名下保存的
sessionid放在请求Cookie中携带,SessionMiddleware就可以通过这个id查询到之前存储的session数据,封装到新请求的request.session对象里,你自然就能读到之前设置的username值了。
你虽然没有手动操作响应对象写Cookie、存session,但这些通用操作都被
SessionMiddleware封装了,这也是Django session能力的核心设计。
内容的提问来源于stack exchange,提问作者mishy
相关产品推荐
相关产品推荐

