You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:06:04