- Python Falcon 教程
- Python Falcon - 首页
- Python Falcon - 简介
- Python Falcon - 环境搭建
- Python Falcon - WSGI vs ASGI
- Python Falcon - Hello World(WSGI)
- Python Falcon - Waitress
- Python Falcon - ASGI
- Python Falcon - Uvicorn
- Python Falcon - API 测试工具
- 请求 & 响应
- Python Falcon - 资源类
- Python Falcon - 应用类
- Python Falcon - 路由
- Falcon - 后缀响应器
- Python Falcon - Inspect 模块
- Python Falcon - Jinja2 模板
- Python Falcon - Cookies
- 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 vs ASGI
Web 服务器网关接口(WSGI)
一些最流行的 Python Web 框架实现了 WSGI(代表 **Web Server Gateway Interface**)。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 通过在标准库中引入 **asyncio** 模块,从 3.4 版本开始支持异步编程。
**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 代表 **Asynchronous Server Gateway Interface**(根据其官方文档,它是 WSGI 的精神继任者),它为 Python Web 服务器、应用程序和框架添加了异步功能。
ASGI 应用程序是一个异步可调用对象(用户定义的函数或具有 **__call__()** 方法的类的对象)。它接受以下三个参数:
**Scope** - 包含特定连接详细信息的 **dict**
**Send** - 一个异步可调用对象,应用程序可以使用它向客户端发送事件消息。
**Receive** - 另一个异步可调用对象。应用程序可以使用它从客户端接收事件消息。
以下是异步函数表示的简单 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!', })