Django的session如何区分不同用户?服务端session如何被request获取?
def sessfun(request) : num_visits = request.session.get('num_visits', 0) + 1 request.session['num_visits'] = num_visits if num_visits > 4 : del(request.session['num_visits']) resp = HttpResponse('view count='+str(num_visits)) return resp
以上是基于Django session的访问计数实现,两个疑问的原理如下:
1. request对象如何获取对应session
Django默认启用了SessionMiddleware中间件,所有请求到达你编写的视图函数前,中间件已经完成了session的自动注入:
- 中间件首先解析请求头的Cookie字段,读取默认键为
sessionid的取值 - 拿着这个
sessionid到服务端的session存储介质(默认是Django自带数据库的django_session表,也可自行配置为缓存、本地文件、Redis等)匹配对应session记录 - 匹配成功的session数据会被封装为
request.session对象绑定到请求实例上,所以你在视图里可以直接调用。
2. 没有显式传session id如何区分不同用户
整个识别流程由服务端和浏览器通过Cookie自动配合完成,不需要手动传参:
- 用户第一次访问站点时,如果请求里没有合法的
sessionid,服务端会生成一个全局唯一的sessionid,同时在服务端存储介质中创建对应的空session记录 - 服务端返回响应时,会自动在响应头的
Set-Cookie字段中写入这个sessionid,浏览器会自动将该Cookie保存在本地 - 后续该浏览器对同一站点的所有请求,都会自动在请求头中携带该站点下的所有有效Cookie,其中就包含
sessionid - 不同浏览器的Cookie存储是完全隔离的,所以Chrome和Firefox会携带不同的
sessionid,服务端自然会识别为两个独立的会话,访问计数互不干扰。
如果浏览器禁用了Cookie,就需要手动把sessionid通过URL参数或者请求体传递,否则服务端无法识别用户身份。
内容的提问来源于stack exchange,提问作者helloworld
相关产品推荐
相关产品推荐

