11.访问flask上下文全局变量

优质
小牛编辑
135浏览
2023-12-01

SocketIO活动处理不同于路由处理,在于它引入了许多容易混淆的东西,围绕着SocketIO什么可以做,什么不可以做。最主要的区别就是SocketIO活动发生在单个长期运行在上下文的请求之中。

尽管有所不同,Flask-SocketIO将环境改造成类似于常规HTTP请求,使SocketIO活动处理更加轻松。接下来的列表描述了什么将会生效,什么不会。

  • 在活动处理函数之前推送应用的上下文使得current_appg可以在处理函数中可用。

  • 这个请求的上下文同样在回调处理函数前被启用,也使requestsession可用。但是注意到WebSocket活动与之并没有独立的联系,因此为连接期间分派的所有事件推送启动连接的请求上下文。

  • request上下文全局变量随一个sid成员增加,这个成员是为了给连接一个独特的会话编号(session ID)。这个值在客户端刚刚添加的时候,就被最初的房间使用了。

  • request上下文全局变量由包含了当前处理函数的命名空间和活动参数的argumentevent来增加。这个活动成员是一个包含了messageargs键值的字典。

  • session上 下文全局变量表现得和通常的请求不一样。在连接开始建立的时候,就会复制一份用户的会话在这个连接上下文中给处理器调用。如果SocketIO处理器修改 了这个会话,这个修改过的会话就会为未来的SocketIO处理器保留,但是正常的HTTP路由处理器不会察觉这些改变。有效率的是,当SocketIO 处理器改变这个会话的时候,会话就会为这些处理器创建一个“分支”(fork)。这个限制的技术原因是用户的会话cookie必须要发送到客户端,这需要 HTTP请求和应答而不是SocketIO连接。在使用服务端的会话时,比如那些由Flask-Session或者Flask-KVSession扩展提 供的会话,在HTTP处理器中的会话改变也可以在SocketIO处理器中可见,只要这个会话不是在SocketIO处理器中修改的。

  • before_requestafter_request钩子不会调用SocketIO活动处理器。

  • SocketIO处理器可以使用自定义的装饰器,但是大多数Flask装饰器并不适于SocketIO处理器,考虑到SocketIO连接中没有Response对象这一概念。