协议阅读 - 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.requesthttp.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 成问题。