Django的session机制

发布于:2025-09-12 ⋅ 阅读:(23) ⋅ 点赞:(0)

一.  关于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

                                                     《 运维经纬 》
 


网站公告

今日签到

点亮在社区的每一天
去签到