Application API
July 26, 2026 · View on GitHub
NoneBot bootstrap 负责默认 Application 的安装与关闭。手工组合或测试替身可使用:
from nonebot_plugin_htmlrender import get_default_application
app = get_default_application()
await app.startup()
await app.probe()
await app.aclose()
只需要通用渲染 facade 时可调用 get_default_renderer();它等价于读取默认Application.renderer,不会建立第二个 composition。Provider 专属或独立图形能力从 Application.extensions.playwright、.takumi、.pillow 与 .skia 获取;第三方自定义能力使用 Application.extensions.require(KEY)。
set_default_application(application) 只供宿主接线、独立 composition 与测试替身替换进程默认对象图,并返回先前的 Application。它不会隐式调用 startup() 或aclose();安装者仍负责新旧对象的完整生命周期。常规 NoneBot 插件由 bootstrap管理默认对象,不应自行替换。
生命周期
startup() 与 aclose() 幂等。aclose() 先拒绝新的 Renderer、Preparation 与Resource Service 异步操作,等待已经获准的完整操作结束,再清理 Provider 与缓存。即使调用方事先保留了 facade 引用,关闭后也不能重新填充缓存。
Application.resources 的 read_bytes() / read_text() 接受 refresh=True 强制刷新单个 resource key,await app.resources.clear() 只清理当前 Application 的 Resource Reader。它不等价于 aclose(),不会清理 Jinja、filehost 或 Provider runtime cache;选择正确操作见缓存组件、失效与调优。
关闭失败可重试,但一旦进入关闭流程便永久拒绝新操作;需要再次渲染时应创建新的composition。同步资源判断也检查同一个 admission gate。Provider 专属 Capability通过自己的 runtime lease 提供等价的拒绝、drain 与关闭后失效语义。
稳定生命周期错误
| 错误 | 含义 |
|---|---|
ApplicationNotInitialized | NoneBot 插件或其他宿主尚未安装进程默认 Application |
ProviderNotFound | 配置的 Provider ID 无法发现 |
ProviderUnavailable | Provider 存在但当前环境不可运行 |
ProviderLifecycleError | startup、probe 或关闭失败 |
CapabilityUnavailable | 当前 composition 未绑定请求的能力 |
ApplicationNotInitialized 与 render.provider: null 无关。插件已经加载但未选择 Provider 时,默认 Application 仍然存在,并保留 Preparation、Resource Service、render_template_html 与显式启用的 Graphics Capability;请求需要 HTML Provider 的位图渲染操作时才会抛出 CapabilityUnavailable。
这些类型都继承 RenderingError,因此生命周期与 composition 失败同样提供message、message_truncated、causes 和 causes_truncated;底层异常仍保留在Python __cause__ 链中。
启动策略见启动与生命周期配置。