Python Falcon - WSGI 与 ASGI


Web 服务器网关接口 (WSGI)

一些最流行的 Python Web 框架实现了 WSGI(代表Web 服务器网关接口)。WSGI本质上是一组Web服务器和Web应用程序之间通用接口的规范,由Web服务器软件实现,用于处理来自基于Python的Web应用程序的请求。WSGI 规范于 2003 年首次引入 (PEP 333),并于 2010 年更新 (PEP 3333)。

服务器通过传递以下参数来调用 WSGI 应用程序对象 -

  • environ - 一个 Python dict对象,类似于 CGI 环境变量和某些 WSGI 特定变量。

  • start_response - 应用程序使用的回调函数,用于返回其响应以及标头和状态代码。

该对象可以是 Python 中的任何可调用对象,例如函数、方法、类或其具有可用__call__()方法的实例。该应用程序对象必须返回一个由单字节字符串组成的迭代器。

def application (environ, start_response):
   ...
   ...
   return [("Hello World!".encode("utf-8")]

然而,启用 WSGI 的服务器在操作上是同步的,因此应用程序的效率不高。Python 在 3.4 版本中引入了asyncio模块作为标准库的一部分,开始支持异步编程。

asyncio模块提供了在 Python 应用程序中合并并发编程风格通常称为协作多任务)的能力。在这种方法中,操作系统不会阻碍不同进程之间的上下文切换。相反,一个进程会定期让出以容纳其他进程,以便许多应用程序可以同时运行。

在Python的3.5版本中,添加了asyncawait这两个关键字。使用 async 关键字定义的 Python 函数将成为协程,因此无法像普通函数一样运行。相反,我们需要使用asyncio.run (coroutine)来调用它。可以通过await关键字暂停一个协程的执行,直到另一个协程完成。

import asyncio
async def main():
   print('hello')
   await asyncio.sleep(5)
   print('world')

asyncio.run(main())

异步服务器网关接口(ASGI)

ASGI 代表异步服务器网关接口(根据其官方文档,它是 WSGI 的精神继承者),它为 Python Web 服务器、应用程序和框架添加了异步功能。

ASGI 应用程序是一个异步可调用对象(用户定义的函数或具有__call__()方法的类的对象)。它需要三个参数,如下 -

  • 范围-包含特定连接详细信息的字典

  • Send - 异步可调用,通过它可以将事件消息发送到客户端

  • 接收- 另一个异步可调用。应用程序可以接收来自客户端的事件消息。

以下是由异步函数表示的简单 ASGI 应用程序的原型 -

async def app(scope, receive, send):
   assert scope['type'] == 'http'
   await send({
   'type': 'http.response.start',
   'status': 200,
   'headers': [
      [b'content-type', b'text/plain'],
   ],
})
await send({
   'type': 'http.response.body',
   'body': b'Hello, world!',
})