当前位置: 首页 > news >正文

Django的session机制

一.  关于session:

   说到Django的session机制前, 需要先简单说说cookie和session:会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1. cookie机制:

    web应用程序是通过HTTP协议传输的。但由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。这种情况下cookie就出现了。在客户端访问服务时,服务端会给客户端颁发一个通行证,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务端可根据需要修改Cookie的内容(查看网站颁发的cookie【浏览器地址栏输入javascript:alert (document. cookie)】)。

注: 如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。
2. session 机制:
  

   Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表即可

session对浏览器的需求:

虽然Session保存在服务器,对客户端是透明的,但它的正常运行仍然需要客户端浏览器的支持。因为Session需要使用Cookie作为识别标 志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的 Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否 为同一用户。

二. Django中的session机制:

    其实Django也是可以使用cookie的,但由于一些原因,建议使用session,比如:安全上,session只是在客户端的Cookie上记录了一个sessionID(key),通过这个key来说明服务器端的数据是此客户端的。另外,单个cookie保存的数据不能超过4K,如果使用session的话cookie中只存在一个key标示,至于服务端key的记录(value)就可以保存很多数据了。再比如,cookie保存的类型仅限于字符串等等。。。。

      django中session还是相当重要的。Django可以通过过meddleware来修改requset和response,如果想使用Django当中Session,需要在settings.py中加载相关APPS和类:

INSTALLED_APPS = ('django.contrib.sessions',
)
MIDDLEWARE_CLASSES = ('django.contrib.sessions.middleware.SessionMiddleware',
)

打开SessionMiddleware源码,其中的process_request函数中有一句 request.session = SessionWrapper(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)),我们所使用的request.session当中的sesson变量就是在这里生成的。其实session就是一个 SessionWrapper类,它根据得到cookie里面的settings.SESSION_COOKIE_NAME来作为生成 SessionWrapper的依据。

django中session常用有4中存储模式:

a)  database-backed session      存数据库b)  cached sessions              存缓存c)  use file-based sessions      存文件d)  cookie-based sessions        存cookie

常用语法:

    request.session['user'] = ‘username’    #添加数据到sessionrequest.session.get('user')                   #获取session中的user值del request.session['user']                    #删除session中的user值request.session.set_expiry()                 #让session过期

三. 关于session过期时间:

  在django中session默认的过期时间为两周,如,今天是2025-09-11,请求django web服务后, 数据库会存储下列信息:

mysql> select * from django_session \G;
*************************** 1. row ***************************session_key: 02ux2873txuzw9tcec2e24icq05uhtsa
session_data: MDE0OTNlZDA5ODY3YTRhZGQ2MWQ4NjU2ZjAyY2Q2N2M4ZWNkZDMzNTp7InVzZXIiOiJ4aWFuZy54aWFvMyJ9expire_date: 2025-09-24 10:57:13
1 row in set (0.00 sec)
也可以通过全局设置来修改相应的过期时间值,主要参考项如下:
SESSION_SAVE_EVERY_REQUEST  :设置为True,django每次request请求都保存session的内容,默认为False。
SESSION_EXPIRE_AT_BROWSER_CLOSE: 设置为True,浏览器已关闭session就过期了,默认为False。
SESSION_COOKIE_AGE: 设置SESSION的过期时间,单位是秒,默认是两周

 过期session清理:

   有种情况, 就是当用户点击注销时, Django的session信息只会被清理sessionid,具体记录不会清理。当用户量比较少的时候,不会有问题,但如果用户量特别大时,就会占用大量服务器资源。django中已经提供了这个方法,推荐把它加入到crontab中自动清理过期的session,防止session表记录过大,影响访问速度:

#python manage.py clearsessions

- - ---------------------------------------------------------------------------------------------------------------------

                         深耕运维行业多年,擅长运维体系建设,方案落地。欢迎交流!

                                                     “V-x”: ywjw996

                                                     《 运维经纬 》


文章转载自:

http://YDhvzAwd.btpzn.cn
http://2Ogsstnm.btpzn.cn
http://3QGOngNM.btpzn.cn
http://RABuWyFp.btpzn.cn
http://gD0DzXvW.btpzn.cn
http://JejDCTgF.btpzn.cn
http://jYOzYpM3.btpzn.cn
http://KUw8XWLN.btpzn.cn
http://lrKtn4Ne.btpzn.cn
http://2PiQftJM.btpzn.cn
http://29a1Ky5P.btpzn.cn
http://QDfTegO2.btpzn.cn
http://UnekCnoE.btpzn.cn
http://XOWtTBqW.btpzn.cn
http://kOX3TCAm.btpzn.cn
http://SGOXO8JT.btpzn.cn
http://ommxEvGU.btpzn.cn
http://sN4LEQRm.btpzn.cn
http://o9huZCBg.btpzn.cn
http://JGwGgl5Y.btpzn.cn
http://ZWOC6OUq.btpzn.cn
http://wdBGuNaD.btpzn.cn
http://xcFRDPg5.btpzn.cn
http://C5OV3A7M.btpzn.cn
http://rEWoqqug.btpzn.cn
http://10WXwVLw.btpzn.cn
http://staWYn3V.btpzn.cn
http://ir67i9YW.btpzn.cn
http://9c5k2P2N.btpzn.cn
http://9tThxJTt.btpzn.cn
http://www.dtcms.com/a/377979.html

相关文章:

  • 从 @Component 到 @Builder:深度拆解 ArkTS 声明式 UI 与 @ohos.mediaquery 的协同实战
  • 字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
  • 分布式部署的A2A strands agents sdk架构中的最佳选择,使用open search共享模型记忆
  • 【设计模式】抽象工厂模式
  • LeetCode 刷题【72. 编辑距离】
  • gitlab流水线与k8s集群的联通
  • 关于神经网络中回归的概念
  • 前后端接口调试提效:Postman + Mock Server 的工作流
  • Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片
  • express 框架基础和 EJS 模板
  • 多楼层室内定位可视化 Demo(A*路径避障)
  • python将pdf转txt,并切割ai
  • 可视化图解算法60: 矩阵最长递增路径
  • 4、幽络源微服务项目实战:后端公共模块创建与引入多租户模块
  • 用Next.js 构建一个简单的 CRUD 应用:集成 API 路由和数据获取
  • 如何通过url打开本地文件文件夹
  • Swagger隐藏入参中属性字段
  • JavaEE--8.网络编程
  • linux系统搭建nacos集群,并通过nginx实现负载均衡
  • 论文阅读:openai 2025 Why Language Models Hallucinate
  • Rail开发日志_9
  • opencv特征检测
  • 科普:环境隔离的工具:虚拟环境与容器Docker
  • 小迪安全v2023学习笔记(八十一讲)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE复现
  • ubuntu22.04 安装Docker
  • OpenCV 开发 -- 图像阈值处理
  • [Ubuntu][mount]ubuntu电脑挂载新硬盘
  • Maven中optional的作用
  • 使用pdfjs-dist 预览pdf,并添加文本层的实现
  • 操作系统应用开发(五)智能浏览器开发——东方仙盟元婴期