django中的Session
Session-Cookie机制
- 网景公司发明了Cookie技术,为了解决浏览器端数据存储问题。
- 每一次request请求时,会把此域名相关的Cookie发往服务器端。服务器端也可以使用response中的set-cookie来 设置cookie值。
- 动态网页技术,也需要知道用户身份,但是HTTP是无状态协议,无法知道。必须提出一种技术,让客户端提交的信息可以表明身份,而且不能更改。这就是Session技术。
- Session开启后,会为浏览器端设置一个Coolie值,即SessionID.
- 这个放置SessionID的Cookie是会话级的,浏览器不做持久化存储只放在内存中,并且浏览器关闭自动清除。浏览器端发起一个HTTP请求后,这个SessionID会通过Cookie发到服务器端,服务端就可以通过这个ID查到对应的一个字典结构。如果查无此ID,就为此浏览器重新生成一个SessionID,为它建立一个SessionID和空字典的映射关系。
- 可以在这个ID对应的Session字典中,存入键值对来保持与当前会话相关的信息。
- Session会定期过期清除
- Session占用服务端内存
- Session如果没有持久化,如果服务程序崩溃,那么所有Session信息丢失
- Session可以持久化到数据库中,如果服务程序崩溃,那么可以从数据库中恢复
开启session支持
- Django可以使用Session
- 在settings中,MIDDLEWARE设置中,启用
django.contrib.sessions.middleware.SessionMiddleware
。
- 在INSTALLED_APPS设置中,启用
django.contrib.sessions
。它是基于数据库存储的Session。
- Session不使用,可以关闭上述配置,以减少开销
- 在数据库的表中的django_session表,记录session信息。但可以使用文件系统或其他cache来存储
登录登出实现
登录实现
- 原来登录成功,会使用jwt的token发往客户端。现在不需要了,只需要在Session中记录登录信息即可。(Django默认请求session会持久化数据库中的django_session表中)
def jsonify(obj,allow=None,exclude=set()):
"""# 筛选对象中的属性,allow白名单,exclude黑名单"""
if allow:
allow = set(map(lambda x: str.lower(x), allow))
fn = lambda x: x.name.lower() in allow
else:
exclude = set(map(lambda x: str.lower(x), exclude))
fn = lambda x: x.name.lower() not