会话机制

发布于 2020-01-17 20:30:45   阅读量 132  点赞 0  

  1. cookies:第一次登陆后服务器返回一些数据(cookie)给浏览器,然后浏览器将数据保存在本地,当该用户发送第二次请求的时候,会将上次请求存储的cookie数据携带给服务器,服务器通过浏览器携带的数据就能判断用户状态。

  2. session:session对象存储特定用户会话所需的属性及配置信息,使得用户在不同的Web页间跳转时,存储在session中的数据不会丢失,而是在整个用户会话中一直存在下去。session只是一种机制,而没有特定的具体实现。对于会话信息,可以存储在浏览器的cookie(需考虑容量、安全等问题),也可以存在服务器端的数据库、文件或缓存中。

  3. session的实现:  ①存储在服务端server side session):Django默认使用的机制,在第一次请求的时候,服务器端通过cookie在浏览器端保存一个sessionid,下次再次请求的时候,会根据携带的sessionidsession库中获取用户的数据,即获取之前保存的状态信息。Django将加密后的session信息默认保存在数据库的django_session表中,当然也可以存储到其他地方,如缓冲、文件系统中。

    ②存储在浏览器端client side session):将session数据加密后直接存储在cookie中,flask框架默认使用的就是这种方式。


一、操作cookie

1.设置cookie

 设置cookie的值返回给浏览器,因此需要操作返回的response对象,通过调用response对象的set_cookie方法来实现,该方法的相关参数如下:

  1. key:设置该 cookie 的key值,即该cookie的名字;

  2. value:设置该 cookie 的value值;

  3. max_age:设置 cookie 的最长生命周期,单位是秒;

  4. expires:过期时间,只不过该参数需要传递一个具体的时间,如datetime对象或者符合日期格式的字符串。若同时设置了expiresmax_age,则会优先以expires的值为过期依据。

    关于使用datetime对象设置时间时的时区问题:

    1. 先将settings.py中的变量TIME_ZONE更改为Asia/Shanghai
    2. 在代码中:
      from datetime import datetime
      from django.utils.timezone import make_aware
      time = datetime(year=2020,month=1,day=17,hour=17,minute=0,second=0)
      time = make_aware(time)
      
  1. path:对域名下的那个路径有效。默认是对域名下的所有路径都有效。

  2. domain:对哪个域名有效。默认对主域名下都有效。

  3. secure:是否是安全的。若设置为True,则只能在https协议下可使用。

  4. httponly:若为True,则在客户端不能通过Js操作 cookie 。默认为False。  

2.删除cookie

 在response对象上调用delete_cookie即可删除 cookie 。Django通过将指定 cookie 的值设为空字符串,将过期时间设置为0,也就是浏览器关闭后就过期。

3.获取cookie

 对于浏览器发送过来的 cookie 信息,可以通过response对象的COOKIES属性来获取,该对象为一个字典类型。  比如想要获取所有的cookie:

cookies = request.COOKIES
for cookie_key,cookie_value in cookies.items():
    print(cookie_key,cookie_value)

二、操作session

 Django中的 session 默认是存储在数据库中的。在django_session表中根据sessionid来存储指定的session数据,再将该sessionid存储到 cookie 中,再次请求时,服务器再从 cookie 中获取sessionid,然后根据sessionid从数据库中获取 session 数据。而我们在操作 session 的时候,无需理会这些细节,只需操作对象request.session即可。

*`session`的常用方法如下:*

  1. get:用来从session对象中获取指定值;

  2. pop:从session中删除一个值,并返回该值;

  3. keys:从session中获取所有的键;

  4. items:从session中获取所有的值;

  5. clear:清除当前用户的session数据;

  6. flush :删除session并删除浏览器中存储的sessionid,一般用于注销。

  7. set_expiry(value):设置过期时间,其中传入的参数value:  ① 整数:表示秒数;

     ② 0:代表浏览器关闭时,当前 session 过期;

     ③ None:使用settings.py中的变量SESSION_COOKIE_AGE配置的全局变量作为过期时间,默认为两周时间。

  8. clear_expired:清除数据库中过期的session,Django并不会清除过期的 session,故需定期地手动清理。或是在终端运行命令python manage.py clearsessions来实行清除。

三、修改session的存储机制

 可以在settings.py中新增配置项SESSION_ENGINE来更改 session 的存储位置,可选的配置方案为:

  1. django.contrib.sessions.backends.db:使用数据库,即为默认的存储方案;

  2. django.contrib.sessions.backends.file:使用文件来存储 session。

  3. django.contrib.sessions.backends.cache:使用缓存来存储 session。要想将数据存储到缓存中,前提是需在settings.py中配置好CACHES,并且需要使用Memcached,而不能使用纯内存作为缓存。

  4. django.contrib.sessions.backends.cached_db:存储的时候会先将数据存到缓存中,再存到数据库中。这样就能保证万一缓存系统出现问题,数据也不会丢失。在获取数据的时候,会先从缓存中获取(保证效率),若缓存中不存在所需数据,则会再从数据库中获取。

  5. django.contrib.sessions.backends.signed_cookies:将 session 信息加密后存储到浏览器的 cookie 中。使用该方式需考虑安全问题,建议设置SESSION_COOKIE_HTTPONLY=True,则在客户端不能通过Js来操作 session 数据,并且还需要对settings.py中的SECRET_KEY进行保密,因为一旦别人知道该SECRET_KEY,那么就可以对数据解密。且需注意在 cookie中,存储的数据不能超过4kb。


Last Modified : 2020-03-09 20:30:45