• 作者:老汪软件技巧
  • 发表时间: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 应用的启动和关闭周期相关,它通常用于执行初始化和清理任务。