flask总结之session,websocket,上下文管理
1.关于session
flask是带有session的,它加密后存储在用户浏览器的cookie中,可以通过app.seesion_interface源码查看
from flask import Flask,session app = Flask(__name__) app.secret_key = 'aptx4869' # 必须要指定这个参数 @app.route('/login') def login(): #... # 设置session session['user_info'] = 'name' return '123' if __name__ == '__main__': app.run(debug=True)
登录后,通过F12查看网络请求信息,可以看到一个Set-Cookie,这个cookie的key就是session,值为一堆加密字符串
由于服务端是单进程,单线程。所有请求过来时会排队。这个字典会放一个key,这个key就是程序的线程id,value存放用户信息
2.关于websocket
它是一个协议,常与http对比,两者都是应用层协议。websocket主要解决了服务端向客户端推送消息(全双工)
http协议规定:一次请求一次响应,属于无状态短链接。http协议只能被动接受客户端给服务端发送的消息
之前该介绍链接:猛戳此处
websocket协议规定:
--握手:base64(sha1(key+magic key))
--收发数据(加密)
-127
-126
<=125
(经过以上三种字节大小判断对数据进行解密)
--持久连接
在三大框架中的使用:
flask中使用了werkzurg,它支持websocket(在新版本中),但是效果不是太好,我们可以使用geventwebsocket模块实现,它既支持http也支持websocket
django中默认socket使用的是wsgiref写的,它也不支持websocket,只支持http协议,但是我们可以使用channel组件实现
tornado中默认使用的是自己的socket,它既支持http协议也支持websocket协议
相关博客链接
3.上下文管理
flask常见第三方组件
# Flask组件 flask-session session放在redis flask-SQLAlchemy 如django里的ORM操作 flask-migrate 数据库迁移 flask-script 自定义命令 blinker 信号-触发信号 # 第三方组件 Wtforms 快速创建前端标签、文本校验 dbutile 创建数据库连接池 gevnet-websocket 实现websocket # 自定义Flask组件 自定义auth认证 参考flask-login组件
flask上下文管理流程:
# a、简单来说,falsk上下文管理可以分为三个阶段: 1、'请求进来时':将请求相关的数据放入上下文管理中 2、'在视图函数中':要去上下文管理中取值 3、'请求响应时':要将上下文管理中的数据清除 # b、详细点来说: 1、'请求刚进来': 将request,session封装在RequestContext类中 app,g封装在AppContext类中 并通过LocalStack将requestcontext和appcontext放入Local类中 2、'视图函数中': 通过localproxy--->偏函数--->localstack--->local取值 3、'请求响应时': 先执行save.session()再各自执行pop(),将local中的数据清除
主要涉及到类:
RequestContext #封装进来的请求(赋值给ctx) AppContext #封装app_ctx LocalStack #将local对象中的数据维护成一个栈(先进后出) Local #保存请求上下文对象和app上下文对象
Flask把Local对象中的的值stack 维护成一个列表原因:
# 因为通过维护成列表,可以实现一个栈的数据结构,进栈出栈时只取一个数据,巧妙的简化了问题。 # 还有,在多app应用时,可以实现数据隔离,列表里不会加数据,而是会生成一个新的列表 # local是一个字典,字典里key(stack)是唯一标识,value是一个列表
相关博客链接