协议阅读 - ASGI
ASGI 全称是 Asynchronous Server Gateway Interface,它旨在为 Python 网络服务器程序提供一套标准接口。它规定了一套服务器交互和运行 app 程序的 API。
它的前身是 WSGI,WSGI 只关注 HTTP 的请求响应模型,另外 WebSocket 也不包括在里面。ASGI 有着更大的野心。
ASGI 有两个组件:Protocol Server & Application。前者处理 sockets,转为 pre-event messages;后者存活在 protocol server, per socket 中,处理 event messages。app 不像 WSGI 那样是个 callable,而是一个 instantiated object。 ASGI connection 也有两部分:connection scope, 和 Events。前者在连接建立期间一直存在,后者则是在连接中有特定事件发生时发送至 app。
- 用户建立连接 = app instance created.
- 直到用户断开链接期间 = connection scope.
- connection scope 会送进来的信息,依赖于协议是怎么规定的。
- app 在进入 初始化,提供了 connection scope 后才能与 client 通信,有的协议中可能还需要等待初始事件。
- http 事件就俩:
http.request
和http.disconnect
- websocket 事件多一些:
websocket.connect
,websocket.receive
,websocket.receive
,websocket.disconnect
. - 消息就是一个 dict,其中至少有个 type 字段。用户可自定义 消息的 type。
- 消息类型限定在byte, unicode, int, float, list, dict, bool, none。JSON 无法区分 byte 和 unicode, 可以将 byte string 转为 base64, 用 U+FFFF 打头。
application(scope)
. scope 也是一个含 type 的 dict, 返回co app_instance(receive, send)
, 其中 receive 是一个等待直到新事件可用的 awaitable, send 是发送完成后会 return 的 awaitable. 简单来说,可以写成下面的样子:
class Application:
def __init__(self, scope):
...
async def __call__(self, receive, send):
...
- low-level 的信息可由 server 处理,无需转为 asgi events. datagram-based protocol 中报文 = 消息,除非 size 成问题。