- 作者:老汪软件技巧
- 发表时间:2024-10-14 17:02
- 浏览量:
import json
# 定义一个辅助函数,将 headers 中的 bytes 转换为字符串
def convert_bytes_to_str(data):
if isinstance(data, bytes):
return data.decode('utf-8')
if isinstance(data, tuple):
return tuple(convert_bytes_to_str(item) for item in data)
if isinstance(data, list):
return [convert_bytes_to_str(item) for item in data]
if isinstance(data, dict):
return {key: convert_bytes_to_str(value) for key, value in data.items()}
return data
async def app(scope, receive, send):
# print(scope)
data = convert_bytes_to_str(scope)
print(json.dumps(data, indent=4))
# 检查请求的类型
if scope['type'] == 'http':
# 等待 HTTP 请求体
event = await receive()
# 响应内容
response_body = json.dumps({"message": "Hello, ASGI!"}).encode('utf-8')
# 发送 HTTP 响应头
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
(b'content-type', b'application/json'),
],
})
# 发送 HTTP 响应体
await send({
'type': 'http.response.body',
'body': response_body,
})
scope 字段中带有二进制的字符串,我们需要一个抓换函数 convert_bytes_to_str.我们简单分析一下,请求路径方法相关的都在 scope 中, scope 不仅仅支持 http 所以需要使用 type 判断当前协议的类型。然后使用 receive 函数接收请求体。然后使用 json.dumps 做一个响应体,并使用 encode 进行编码。最后发送请求头和请求体。
这里发送了两次,这设计符合异步的需求,增强不同的应用场景的处理能力(流式响应)。有了实际项目认知我们就可以从理论基础了解 ASGI 了。
ASGI
异步服务器网关接口(Asynchronous Server Gateway Interface),是一个用于构建异步 Web 应用程序的Python 协议。
ASGI主要特点
ASGI 的主要特点:
ASGI协议组成应用程序接口
ASGI应用程序接口定义了应用程序如何与ASGI服务器交互。一个ASGI应用程序是一个可调用的对象,通常是一个异步函数,它接受两个参数:scope和receive,并返回一个send异步生成器。
服务器接口
服务器接口的主要职责包括:
事件循环接口
事件循环接口是ASGI协议中隐含的一部分,它是由ASGI服务器管理的,而不是直接由ASGI协议定义。
事件循环负责调度和执行异步任务,是异步编程的核心。事件循环的主要功能包括:
在ASGI中,事件循环通常由以下Python库提供:
ASGI服务器和应用程序都依赖于事件循环来执行异步操作,这使得它们能够高效地处理大量并发连接。
ASGI 事件
ASGI 事件驱动模型处理生命周期管理(启动和关闭)、HTTP 请求的处理、WebSocket 连接的管理等。通过不同类型的事件,开发者可以精细地控制连接和数据流动,实现异步并发处理。
Lifespan 事件
lifespan 事件与 ASGI 应用的启动和关闭周期相关,它通常用于执行初始化和清理任务。