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

《 运维经纬 》

相关推荐
我材不敲代码2 小时前
Python实现打包贪吃蛇游戏
开发语言·python·游戏
0思必得04 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
韩立学长4 小时前
【开题答辩实录分享】以《基于Python的大学超市仓储信息管理系统的设计与实现》为例进行选题答辩实录分享
开发语言·python
qq_192779874 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u0109272714 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊4 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
Imm7775 小时前
中国知名的车膜品牌推荐几家
人工智能·python
tudficdew5 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python
sjjhd6525 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
2301_821369616 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python