11.访问flask上下文全局变量
SocketIO活动处理不同于路由处理,在于它引入了许多容易混淆的东西,围绕着SocketIO什么可以做,什么不可以做。最主要的区别就是SocketIO活动发生在单个长期运行在上下文的请求之中。
尽管有所不同,Flask-SocketIO将环境改造成类似于常规HTTP请求,使SocketIO活动处理更加轻松。接下来的列表描述了什么将会生效,什么不会。
在活动处理函数之前推送应用的上下文使得
current_app
和g
可以在处理函数中可用。这个请求的上下文同样在回调处理函数前被启用,也使
request
和session
可用。但是注意到WebSocket活动与之并没有独立的联系,因此为连接期间分派的所有事件推送启动连接的请求上下文。request
上下文全局变量随一个sid成员增加,这个成员是为了给连接一个独特的会话编号(session ID)。这个值在客户端刚刚添加的时候,就被最初的房间使用了。request上下文全局变量由包含了当前处理函数的命名空间和活动参数的
argument
和event
来增加。这个活动成员是一个包含了message
和args
键值的字典。session
上 下文全局变量表现得和通常的请求不一样。在连接开始建立的时候,就会复制一份用户的会话在这个连接上下文中给处理器调用。如果SocketIO处理器修改 了这个会话,这个修改过的会话就会为未来的SocketIO处理器保留,但是正常的HTTP路由处理器不会察觉这些改变。有效率的是,当SocketIO 处理器改变这个会话的时候,会话就会为这些处理器创建一个“分支”(fork)。这个限制的技术原因是用户的会话cookie必须要发送到客户端,这需要 HTTP请求和应答而不是SocketIO连接。在使用服务端的会话时,比如那些由Flask-Session或者Flask-KVSession扩展提 供的会话,在HTTP处理器中的会话改变也可以在SocketIO处理器中可见,只要这个会话不是在SocketIO处理器中修改的。before_request
和after_request
钩子不会调用SocketIO活动处理器。SocketIO处理器可以使用自定义的装饰器,但是大多数Flask装饰器并不适于SocketIO处理器,考虑到SocketIO连接中没有Response对象这一概念。