- Python Falcon教程
- Python Falcon - 主页
- Python Falcon - 简介
- Python Falcon - 环境设置
- Python Falcon - WSGI 与 ASGI
- Python Falcon - Hello World(WSGI)
- Python Falcon - 女服务员
- Python Falcon - ASGI
- 蟒蛇Falcon - Uvicorn
- Python Falcon - API 测试工具
- 请求与响应
- Python Falcon - 资源类
- Python Falcon - 应用程序类
- Python Falcon - 路由
- Falcon - 后缀响应者
- Python Falcon - 检查模块
- Python Falcon - Jinja2 模板
- Python Falcon - cookie
- Python Falcon - 状态代码
- Python Falcon - 错误处理
- Python Falcon - 钩子
- Python Falcon - 中间件
- Python Falcon - CORS
- Python Falcon - Websocket
- Python Falcon - Sqlalchemy 模型
- Python Falcon - 测试
- Python Falcon - 部署
- Python Falcon 有用资源
- Python Falcon - 快速指南
- Python Falcon - 有用的资源
- Python Falcon - 讨论
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版本中,添加了async和await这两个关键字。使用 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!', })