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'    #添加数据到session
    request.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: MDE0OTNlZDA5ODY3YTRhZGQ2MWQ4NjU2ZjAyY2Q2N2M4ZWNkZDMzNTp7InVzZXIiOiJ4aWFuZy54aWFvMyJ9
 expire_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

《 运维经纬 》

相关推荐
SXJR3 小时前
Java mp4parser 实现视频mp4 切割
java·python·音视频
EvanSun__3 小时前
Flask 框架引入
后端·python·flask
小王不爱笑1323 小时前
Java基础知识(十四)
java·windows·python
烟锁池塘柳04 小时前
【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
开发语言·python·matplotlib
周小码4 小时前
llama-stack实战:Python构建Llama应用的可组合开发框架(8k星)
开发语言·python·llama
IT学长编程4 小时前
计算机毕业设计 基于Hadoop的南昌房价数据分析系统的设计与实现 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试
大数据·hadoop·python·毕业设计·课程设计·毕业论文·豆瓣电影数据可视化分析
郑洁文4 小时前
豆瓣网影视数据分析与应用
大数据·python·数据挖掘·数据分析
kyle~4 小时前
python---PyInstaller(将Python脚本打包为可执行文件)
开发语言·前端·python·qt
guidovans5 小时前
Crawl4AI精准提取结构化数据
人工智能·python·tensorflow