session
1.概念:
- 保存在服务器的数据叫做 session
- session需要依赖于cookie
2. Django中开启session
可以在settings.py文件中查看,如图所示
如需禁用session,将上图中的session中间件注释掉即可。
3 session存储方式
在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。
2.1 数据库
存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。
数据库中的表如图所示
表结构如下
说明:由表结构可知,操作Session包括三个数据:键,值,过期时间。
2.2 本地缓存
存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
2.3 混合存储
优先从本机内存中存取,如果没有则从数据库中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
2.4 Redis
在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
1) 安装扩展
pip install django-redis
2)配置
在settings.py文件中做如下设置
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } } SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default'
注意: 如果redis的ip地址不是本地回环127.0.0.1,而是其他地址,访问Django时,可能出现Redis连接错误,如下:
解决方法:
- 修改redis的配置文件,添加特定ip地址。
- 打开redis的配置文件,并添加绑定的ip
sudo vim /etc/redis/redis.conf
3.
3. 重新启动redis服务
sudo service redis-server restart
4. session流程:
第一次请求:
① 第一次请求的时候 cookie中没有任何信息
② 当服务器接收到这个请求之后,设置session信息
③ 在设置session信息的时候,session信息保存在服务器端, 同时服务器会在响应头中设置一个 sessionid 的cookie信息(由服务器自己设置的,不是我们设置的)
④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息)
第二次及其之后的请求:
⑤ 第二次及其之后的请求都会携带包含session id的cookie信息
⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证,验证成功,则可以获取 session信息(session信息保存在服务器端)
5.示例:
1.第一次请求,设置session:
def set_session(request): """ 第一次请求: ① 我们第一次请求的时候可以携带一些信息(用户名/密码) cookie中没有任何信息 ② 当我们的服务器接收到这个请求之后,进行用户名和密码的验证,验证没有问题可以设置session 信息 ③ 在设置session信息的同时(session信息保存在服务器端).服务器会在响应头中设置一个 sessionid 的cookie信息 ④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息) """ # 1.cookie中没有任何信息 print(request.COOKIES) # {} #2. 如果是登录页面请求,携带用户名密码,则对用户名和密码进行验证 # 假设认为 用户名和密码正确 user_id=6666 #3.设置session信息 # request.session 理解为字典 # 设置session的时候其实 session做了2件事 #第一件: 将数据保存在数据库中 #第二件: 设置一个以sessionid为key的cookie信息 request.session['user_id']=user_id #4. 返回响应 return HttpResponse('set_session')
查看浏览器端的cookie可以看到:
2.第二次及后面的请求,获取session
def get_session(request): """ 第二次及其之后的请求: ⑤ 第二次及其之后的请求都会携带 session id信息 ⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证, 验证成功,则可以获取 session信息(session信息保存在服务器端) """ #1. 请求都会携带 session id信息 print(request.COOKIES) #2. 会获取到sessionid信息,然后进行验证, # 验证成功,可以获取 session信息( # request.session 字典 user_id=request.session['user_id'] user_id=request.session.get('user_id') # #3.返回响应 return HttpResponse('get_session')
6. Session操作汇总
通过HttpRequest对象的session属性进行会话的读写操作。
1) 以键值对的格式写session。
request.session['键']=值
2)根据键读取值。
request.session.get('键',默认值)
3)清除所有session,在存储中删除值部分。
request.session.clear()
4)清除session数据,在存储中删除session的整条数据。
request.session.flush()
5)删除session中的指定键及值,在存储中只删除某个键及对应的值。
del request.session['键']
6)设置session的有效期
request.session.set_expiry(value)
- 如果value是一个整数,session将在value秒没有活动后过期。
- 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
- 如果value为None,那么session有效期将采用系统默认值, 默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构