v0.7.2 迁移说明¶
历史文档
本页只描述 0.7.1 → 0.7.2,不能作为 0.8 API 或配置依据。升级到当前版本请阅读 v0.8 迁移指南。
v0.7.2 修复远程 Playwright 无法读取 Bot 容器内 file:// 模板的问题,并把资源准备、缓存和后端执行统一到同一套生命周期模型。v0.7.1 已发布公共 API 保持兼容;本页列出默认行为变化和需要主动迁移的含糊配置。
pre-1.0 兼容策略
项目当前仍处于 0.x。v0.7.2 以“保护已发布 API,同时修正不可靠默认值和未发布接口”为兼容原则,不宣称遵循 SemVer 对 patch 版本的兼容承诺。升级前应按本页完成回归。
远程 Markdown 不再访问包内 file://¶
v0.7.1 的 md_to_pic / render_markdown 可能让远程 Chromium 打开 Bot 容器中的模板路径:
file:///app/.venv/lib/python3.x/site-packages/
nonebot_plugin_htmlrender/templates/markdown/markdown.html
当 Playwright 运行在另一个容器时,这会在 page.goto() 阶段得到 ERR_FILE_NOT_FOUND。v0.7.2 的内置模板在 Bot 进程中渲染为 HTML,随后通过 page.set_content() 注入;页面本身不依赖远端 filesystem。
以下配置可以继续使用,不需要手工增加 HTTP base_url:
RENDER_BACKEND=playwright
RENDER_PLAYWRIGHT={"connect_ws":{"endpoint":"ws://playwright:53333/playwright"}}
远程资源默认改为内存桥¶
远程 session 的有效默认组合变为:
本地图片、字体、CSS 与模板资源读取为 PreparedAsset,按 SHA-256 去重,并通过当前Page 的 route 直接返回 bytes、正确媒体类型、cache header 与Access-Control-Allow-Origin: *。这些资源 payload 不写持久化目录或其他磁盘位置,Page 关闭后释放;Playwright 浏览器文件与 runtime snapshot 仍可使用插件数据目录。
如果你依赖旧行为,请显式声明意图:
- 共享卷且 Bot/Chromium 使用完全相同的路径:
remote_local_resource_policy=passthrough; - 需要浏览器外部也能访问的 HTTP URL:安装
[filehost]并设置remote_local_resource_policy=filehost; - 希望任何本地引用都失败:
remote_local_resource_policy=error。
filehost 的 TTL 现在明确为 URL mapping TTL。它不承诺逐文件物理删除;物理文件由 nonebot-plugin-filehost 的进程级临时目录生命周期管理。
分离 base_url 与 document_url¶
v0.7.2 固定以下语义:
PreparedHtml.base_url:解析 HTML/CSS 的相对资源,不触发导航;PageConfig.document_url:显式要求page.goto()的页面 URL。
v0.8 已删除 PageConfig.base_url 兼容别名;实际导航目标必须使用 document_url:
# Before: one field carried two meanings
pages = {"base_url": "https://render.example/card"}
# After: navigation is explicit
pages = {"document_url": "https://render.example/card"}
资源 origin 由 preparation source 或 prepare_html(..., base_url="https://render.example/assets/") 放入 PreparedHtml.base_url,不再混入 Page 配置。
普通 text、Markdown、模板与 rasterize_html 不需要 document_url,默认在 about:blank 上直接 set_content()。远程 file:// 文档导航不再作为默认资源传输方案;只有显式 passthrough 且浏览器确实挂载同一路径时才可使用。
内置模板属于 wheel¶
text 与 Markdown 模板只随 distribution 分发:
- 使用
importlib.resources与 JinjaPackageLoader读取; - 文件登记在 wheel
RECORD; - 卸载 Python package 时随 distribution 自动删除。
它们不会复制到插件数据目录。项目不提供 uninstall hook、模板复制、持久化目录清理或用户覆盖目录。render_cache_path 与 render_config_path 当前为保留配置,没有模板消费者;进程内 cache 和 PreparedAsset 也不在这些目录落盘。
用户模板仍由 render_template(template_path=...) 从显式 filesystem 目录读取。
Prepared model 变更¶
v0.7.2 的内部/新 API 契约为:
PreparedHtml.html保留原始浏览器文档;PreparedStylesheet(css, base_url, embedded, media)结构化表达样式;PreparedAsset.source是文档资源标识,bytes 由两个后端共用;PreparedAssetIndex负责 exact 与相对基址规范化匹配。
当前开发分支曾短暂公开但从未发布的 PreparedHtml.markup,以及 TEMPLATES_PATH、TEXT_TEMPLATES_PATH、MARKDOWN_TEMPLATES_PATH、TEXT_TEMPLATE_FILE、MARKDOWN_TEMPLATE_FILE 五个 Path 常量已撤回。它们不属于 v0.7.1 兼容范围,也不应成为用户代码依赖。
Takumi 后端¶
安装方式:
该 extra 精确锁定 takumi-py==0.2.0。Takumi 与 Playwright 共用 preparation、资源 bytes、Jinja 和 filesystem cache,但保持能力边界:
- 只支持静态 HTML/CSS,不执行 JavaScript 或网络页面;
- 只向 native 传实际引用的图片;
- Python/Rust 边界前严格验证 UTF-8;
- compiled cache 同时受 entry 与 32 MiB 默认 weight 上限约束;
- filesystem 字体默认
revalidate,内容变化后需重建 runtime; - 无法表达的
<style media>等条件 stylesheet 明确抛出TakumiUnsupportedError,不会静默提升为全局 CSS。
需要 JS、网页导航、元素截图或完整浏览器布局时继续使用 Playwright。
可选遥测插件改为按配置选择性引导¶
v0.7.1 在导入阶段无条件 require 两个可选插件(只要装了就加载),且 Prometheus 默认启用。v0.7.2 改为**按 htmlrender 自身配置门控**的导入期引导,且**两个集成均默认关闭**:仅当集成显式启用且插件已安装时才 require。
- Prometheus:
nonebot_plugin_prometheus通过@driver.on_startup挂载/metrics路由,必须在启动阶段被消费前注册。htmlrender 在导入阶段按prometheus_enable(默认关闭,需显式true)+ 安装状态引导,启用时端点如期挂载、指标可被抓取。 - Sentry:
nonebot_plugin_sentry导入即sentry_sdk.init(),htmlrender 在导入阶段按是否配置了sentry_dsn(默认未配置即关闭)来引导。
需要主动迁移的点:
- Prometheus 默认翻转为关闭。v0.7.1 只要装了插件就默认启用并暴露
/metrics;v0.7.2 起必须显式设prometheus_enable=true才会引导端点与记录指标。依赖旧默认的部署需补上该配置。 - 若你此前依赖「装了但通过配置关闭仍被加载」这一副作用,也需调整为显式启用。
升级验收清单¶
- 远程
render_text与普通/数学 Markdown 不出现 Bot 侧file://导航; - Markdown 相对图片按 Markdown 文件目录解析;
- 自定义 CSS 的字体和背景图按 CSS 文件目录解析;
- 动态
startup_render(endpoint=...)与静态 WS/CDP 配置行为一致; - 共享卷部署已显式选择
passthrough,filehost 部署已显式选择filehost; - 依赖页面导航的代码已从
base_url迁移到document_url; - Takumi 内容不包含 JS、网络资源或条件 stylesheet;
- 不再导入未发布的模板 Path 常量或
PreparedHtml.markup; - 依赖 Prometheus 的部署已显式设
prometheus_enable=true(默认已关闭),/metrics端点正常挂载。
更多历史背景见 远程 Playwright 部署、Takumi 配置 与 资源管线。