ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

NoneBot2 Quart 驱动器:基于 Quart 与 uvicorn 的 ASGI 服务端驱动配置与开发指南

NoneBot2 Quart 驱动器:基于 Quart 与 uvicorn 的 ASGI 服务端驱动配置与开发指南 后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载本篇技术指南围绕 NoneBot2 内置的nonebot.drivers.quart驱动展开介绍如何安装、配置并以 QuartFlask 的 asyncio 异步重实现作为机器人服务端驱动运行同时深入源码讲解Driver、Config、WebSocket等核心类的实现原理。读完本文你将掌握在.env中配置DRIVER~quart的完整方法、六项 Quart 专属配置项的作用与默认值以及 HTTP / WebSocket 服务端路由注册与消息收发机制可直接应用于反向连接型协议适配器的接入场景。Quart 驱动是什么nonebot.drivers.quart是 NoneBot2 内置的ASGI 服务端驱动器其底层是 Quart——一个 asyncio 异步重实现的 Flask 微框架接口与 Flask 高度相似。作为服务端型Reverse驱动器它负责监听端口、接收来自聊天平台如 OneBot 等的 HTTP 上报请求与 WebSocket 客户端连接是机器人运行的数据收发基石之一。需要特别注意的是官方文档在 nonebot/drivers/quart.py 与 API 文档中均明确提示本驱动仅支持服务端连接也就是说Quart 驱动只能作为服务端接收连接不提供 HTTP 客户端请求能力。若机器人同时需要主动调用平台 API客户端请求必须通过DRIVER配置语法与其他客户端型驱动如~httpx、~aiohttp配合使用例如DRIVER~quart~httpx驱动器配置格式为module[:Driver][module[:Mixin]]*~是内置驱动模块路径nonebot.drivers.的缩写完整规则可参考 advanced/driver.md 中的配置驱动器章节。安装 Quart 驱动Quart 驱动所需的额外依赖并非随 NoneBot2 默认安装需要显式安装。官方提供了两种方式# 使用 nb-cli 安装 nb driver install quart # 或者使用 pip 直接安装对应 extra pip install nonebot2[quart]从源码可以看出安装的必要性nonebot/drivers/quart.py 在模块顶部通过try/except ModuleNotFoundError导入quart、uvicorn等依赖一旦缺失会抛出如下错误ImportError: Please install Quart first to use this driver. Install with pip: pip install nonebot2[quart]在 .env 中配置 Quart 驱动器NoneBot2 通过全局配置项DRIVER选择驱动器。将以下配置写入项目根目录的.env或.env.{environment}文件环境文件加载机制见 nonebot/config.pyenvironment默认为prodDRIVER~quart其中~quart等价于完整模块路径nonebot.drivers.quart:Driver。由于 NoneBot2 的Config基类配置了case_sensitiveFalse且支持从环境变量与 dotenv 文件读取见 nonebot/config.py配置项大小写不敏感。服务端监听地址与端口由全局配置HOST默认127.0.0.1和PORT默认8080取值区间 1~65535决定它们会被Driver.run()作为 uvicorn 的启动参数使用。Quart 驱动配置项Config 类Quart 驱动将专属配置封装在ConfigpydanticBaseModel中完整定义位于 nonebot/drivers/quart.py。在Driver.__init__中通过type_validate_python(Config, model_dump(config))从全局配置中提取所有quart_*前缀字段见 nonebot/drivers/quart.py因此所有配置项均以QUART_前缀写入.env。配置项类型默认值说明quart_reloadboolFalse开启/关闭 uvicorn 冷重载quart_reload_dirslist[str] \| NoneNone重载监控文件夹列表None时使用 uvicorn 默认值quart_reload_delayfloat0.25重载延迟秒源码默认0.25与 uvicorn 默认值一致quart_reload_includeslist[str] \| NoneNone要监听的文件列表支持 glob patternNone时使用 uvicorn 默认值quart_reload_excludeslist[str] \| NoneNone不要监听的文件列表支持 glob patternNone时使用 uvicorn 默认值quart_extradict[str, Any]{}传递给Quart构造函数的其他关键字参数一个完整的配置示例DRIVER~quart HOST0.0.0.0 PORT8080 # Quart 驱动专属配置 QUART_RELOADfalse QUART_RELOAD_DIRS[.] QUART_RELOAD_DELAY0.5 QUART_RELOAD_INCLUDES[*.py, *.env] QUART_RELOAD_EXCLUDES[*.log] QUART_EXTRA{max_content_length: 1048576}注意quart_reload_dirs、quart_reload_includes、quart_reload_excludes为列表类型在.env中需按 JSON 序列化格式书写NoneBot2 的配置解析对复杂类型会尝试json.loads机制见 nonebot/config.py。关于冷重载quart_reload的注意事项quart_reload直接映射到 uvicorn 的reload参数开启后 uvicorn 会监控文件变化并冷重启进程。官方在 advanced/driver.md 中对此有明确警告不推荐开启该配置项在 Windows 平台上开启该功能有可能会造成预料之外的影响替代方案使用nb-cli命令行工具以及参数--reload启动 NoneBot。nb run --reload另外开启 reload 模式要求机器人入口文件提供 ASGI 应用路径典型写法如下import nonebot app nonebot.get_asgi() nonebot.run(appbot:app)这因为Driver.run()允许传入app参数ASGI 应用导入字符串优先级高于驱动器内部的 Quart 实例详见下文run()方法。Driver 类核心 API 与实现原理Driver(env, config)继承自BaseDriver与ASGIMixin定义见 nonebot/drivers/quart.py其中ASGIMixin是 NoneBot2 的 ASGI 服务端基类其抽象接口定义在 nonebot/internal/driver/abstract.py要求实现server_app、asgi属性以及setup_http_server、setup_websocket_server方法。实例属性type / server_app / asgi / logger成员类型说明typestr驱动名称固定返回quartserver_appQuart内部的Quart应用对象asgiQuart同样返回Quart对象Quart 本身即 ASGI 应用loggeruntypedQuart 使用的 logger即self._server_app.logger在Driver.__init__中见 nonebot/drivers/quart.py驱动会执行以下初始化从全局配置解析 Quart 专属Config以self.__class__.__qualname__作为应用名创建Quart实例并把quart_extra中的参数展开传入因此QUART_EXTRA可覆盖max_content_length、static_folder等 Quart 构造参数通过before_serving/after_serving挂载 NoneBot2 的生命周期管理self._lifespan.startup/shutdown确保框架启动/停止钩子随服务启停执行。setup_http_server注册 HTTP 上报路由async def _handle() - Response: return await self._handle_http(setup) self._server_app.add_url_rule( setup.path.path, endpointsetup.name, methods[setup.method], view_func_handle, )方法签名接收一个 HTTPServerSetup 数据类定义于 nonebot/internal/driver/model.py含path、method、name、handle_func四个字段将协议适配器定义的 HTTP 回调地址注册进 Quart 路由表。协议适配器通常通过driver.setup_http_server(HTTPServerSetup(...))完成上报端点注册。请求处理流程_handle_http见 nonebot/drivers/quart.py从 Quart 的request全局对象提取 JSONrequest.is_json时、表单数据request.form与文件request.files文件统一转换为 NoneBot2 内部的FileTypes三元组(filename, stream, content_type)将上述信息组装为 NoneBot2 统一的 Request 对象含 method、url、headers、cookies、content、data、json、files、version调用适配器注册的handle_func(http_request)得到统一的Response对象转换为 QuartResponsestatus_code 默认200headers 从dict(response.headers)还原返回。setup_websocket_server注册 WebSocket 连接路由async def _handle() - None: return await self._handle_ws(setup) self._server_app.add_websocket( setup.path.path, endpointsetup.name, view_func_handle, )对应 WebSocketServerSetup定义于 nonebot/internal/driver/model.py含path、name、handle_func字段。_handle_ws见 nonebot/drivers/quart.py会基于 Quart 的websocket_ctx构建统一的BaseRequest方法固定取websocket.method即 WebSocket 握手请求的 HTTP 方法再包装成WebSocket对象交给适配器的handle_func。run使用 uvicorn 启动 Quartrun(hostNone, portNone, *args, appNone, **kwargs)的核心逻辑见 nonebot/drivers/quart.py先调用基类super().run(...)打印已加载适配器日志构建自定义LOGGING_CONFIG将 uvicorn 的uvicorn.error、uvicorn.access日志统一接入 NoneBot2 的nonebot.log.LoguruHandler使访问日志与框架日志风格一致调用uvicorn.run(...)依次传入app优先使用run()传入的app参数ASGI 应用字符串路径否则使用驱动器内部的self.server_apphost/port优先使用方法参数否则回退到全局配置self.config.host/self.config.portreload、reload_dirs、reload_delay、reload_includes、reload_excludes全部取自 QuartConfig其余**kwargs透传给uvicorn.run可用于覆盖log_level、ssl_keyfile、workers等 uvicorn 参数。WebSocket 封装类API 与类型安全WebSocket(*, request, websocket_ctx)是 NoneBot2 对 Quart WebSocket 的适配封装继承自统一基类 WebSocket抽象接口见 nonebot/internal/driver/model.py将底层WebsocketContext.websocket暴露为websocket属性。方法一览方法签名返回说明accept()无参数untyped接受 WebSocket 连接请求close(code1000, reason)code: int、reason: struntyped关闭连接code默认1000正常关闭receive()无参数str \| bytes接收一条 text/bytes 信息receive_text()无参数str接收一条 text 信息若收到 bytes 帧则抛出TypeErrorreceive_bytes()无参数bytes接收一条 binary 信息若收到 text 帧则抛出TypeErrorsend_text(data)data: struntyped发送一条 text 信息send_bytes(data)data: bytesuntyped发送一条 binary 信息异常处理与 closed 属性源码为receive、receive_text、receive_bytes三个方法装饰了catch_closed装饰器见 nonebot/drivers/quart.py当底层接收因连接关闭而被取消asyncio.CancelledError时统一转换为 NoneBot2 的WebSocketClosed(1000)异常供上层适配器以标准方式感知连接断开。另外需要注意一个实现细节closed属性在 nonebot/drivers/quart.py 中带有# FIXME注释当前恒返回True。这意味着从源码结构看Quart 驱动暂时无法通过closed准确判断连接实时状态判断连接是否关闭仍以receive抛出WebSocketClosed为准。测试验证Quart 驱动的服务端能力仓库测试 tests/test_driver.py 将 Quart 与 FastAPI 驱动并列验证了服务端能力可作为实战参考test_http_servertests/test_driver.py注册HTTPServerSetup(URL(/http_test), POST, http_test, handler)后通过app.test_server(driver.asgi)发送 POST 请求断言状态码与响应体正确test_websocket_servertests/test_driver.py注册 WebSocket 路由后依次验证 text/bytes 的收发、receive_text/receive_bytes的类型分流以及连接关闭后receive抛出WebSocketClosedtest_cross_contexttests/test_driver.py验证 WebSocket 对象可跨任务上下文使用即连接建立后在后台任务中继续收发消息。这些测试同时证明了driver.asgi可直接挂载到测试客户端或其他 ASGI 服务器如uvicorn上运行。与 FastAPI 驱动的对比Quart 驱动与默认的 FastAPI 驱动在 advanced/driver.md 中并列介绍二者同属 ASGI 服务端驱动器实现结构高度相似见 nonebot/drivers/fastapi.py维度QuartFastAPI底层框架QuartFlask 异步版FastAPI基于 StarletteDRIVER配置~quart~fastapi默认配置前缀QUART_*FASTAPI_*启动方式均通过uvicorn.run启动同左专属能力QUART_EXTRA传参额外支持fastapi_openapi_url、fastapi_docs_url、fastapi_redoc_url、fastapi_include_adapter_schema等文档相关配置选择 Quart 的典型场景是协议适配器或业务代码本身基于 Flask 风格 API如使用before_serving、add_url_rule等接口或有 Quart 生态依赖需要 NoneBot2 服务端与既有 Quart 应用保持一致的使用体验。若没有特殊需求默认的 FastAPI 驱动即可满足大多数反向连接场景。参考文档与源码入口API 文档原文website/versioned_docs/version-2.5.0/api/drivers/quart.md驱动源码实现nonebot/drivers/quart.py驱动基类与 ASGIMixinnonebot/internal/driver/abstract.pyRequest/Response/WebSocket 与路由 Setup 数据类nonebot/internal/driver/model.py驱动器选择与配置指南website/versioned_docs/version-2.5.0/advanced/driver.md服务端驱动集成测试tests/test_driver.py赞分享后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载相关推荐NoneBot2 Quart 驱动适配基于 ASGI 的服务端驱动器配置与 WebSocket 封装详解NoneBot2 Quart 驱动适配基于 ASGI 的服务端驱动器配置与 WebSocket 封装详解 导读 本文围绕 NoneBot2 内置的 Quart后端即时通讯NoneBot2 Quart 驱动完全指南基于 ASGI 的服务端驱动器配置、路由与 WebSocket 实战NoneBot2 Quart 驱动完全指南基于 ASGI 的服务端驱动器配置、路由与 WebSocket 实战 导读 Quart 是一个基于 asyncio后端即时通讯NoneBot2 FastAPI 驱动基于 nonebot.drivers.fastapi 的服务端 ASGI 驱动配置与开发指南NoneBot2 FastAPI 驱动基于 nonebot.drivers.fastapi 的服务端 ASGI 驱动配置与开发指南 本篇技术指南围绕 None后端即时通讯上一篇终极免费方案无名杀网页版即开即玩完整指南下一篇DDrawCompat让经典DirectX游戏在现代Windows重获新生的终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进