模板与资源¶
模板渲染分为 Preparation 与执行两个阶段。Preparation 读取模板及受策略允许的资源,生成中立 PreparedHtml;Provider 只负责执行已准备内容。
组织模板¶
把模板和它引用的静态资源放在同一受控目录,并将最小目录加入render.resources.local_access.allowed_paths。template_base 只负责相对路径定位,不会扩大本地访问白名单。
from nonebot_plugin_htmlrender import render_template
image = await render_template(
"templates",
"profile.html",
{"name": "Alice", "avatar": "assets/avatar.png"},
width=720,
)
可运行项目见 examples/template_render。如果只需要 HTML,使用render_template_html,无需配置位图 Provider。
自定义 Jinja filter¶
通过 filters 为单次模板调用注入受信任的同步或异步 callable。filter 会在模板编译前进入对应 Jinja Environment;应复用模块级函数,使相同模板和 filter 组合能够命中 Environment cache:
from nonebot_plugin_htmlrender import render_template
def format_percent(value: float) -> str:
return f"{value:.1%}"
image = await render_template(
"templates",
"progress.html",
{"progress": 0.625},
filters={"percent": format_percent},
)
不要在循环中创建 lambda、partial 或临时 bound method;不同 callable 身份会生成不同 Environment key。同步 filter 在事件循环线程执行,不应包含阻塞 I/O。模板源码、filters 与 extensions 都是可执行的受信任代码,不能直接来自用户输入。
render_template 会先把变量中的 Path/bytes 准备成资源 URL,再调用 filter;render_template_html 不物化资源,filter 会看到原始变量。缓存 key、异步 filter 和失效边界见缓存组件、失效与调优。
预先解析变量¶
需要在模板外观察最终 URL 或 filehost 请求头时,使用resolve_template_vars 或 to_resource_url。它们返回 ResourceResolution;请求头只授权结果中对应的精确 URL,不得扩展到同 host、路径前缀或重定向目标。
from nonebot_plugin_htmlrender import resolve_template_vars
result = await resolve_template_vars(
{"avatar": "assets/avatar.png"},
template_base="templates",
strict=True,
)
variables = result.value
选择资源传输¶
本地 Provider 可直接读取受授权资源;远程 Playwright 默认使用单次操作内存桥。只有浏览器必须通过 HTTP 拉取资源时才选择 filehost,共享挂载路径完全一致时才选择passthrough。完整配置见资源、缓存与访问策略和远程 Playwright 部署。