尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

OctoPrint 2.0.0 插件迁移完全指南:从废弃 API 清理到 pyproject.toml 现代化

发布时间:2026/9/25 1:57:20

资讯中心
01
ARTICLE

OctoPrint 2.0.0 插件迁移完全指南:从废弃 API 清理到 pyproject.toml 现代化

OctoPrint 2.0.0 插件迁移完全指南:从废弃 API 清理到 pyproject.toml 现代化
物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载OctoPrint 2.0.0 正式移除了过去十年间累积的大量兼容层长期忽略弃用警告的插件将面临 API 断裂。本文以官方迁移文档为主体结合仓库源码逐一梳理服务端、客户端、API 与项目组织层面的全部破坏性变更为插件作者提供可直接对照执行的重命名清单、替换代码与配置映射表。读完本文你将掌握如何把octoprint.access.users的旧式 camelCase 方法批量替换为 snake_case 新 API、如何应对BlueprintPlugin端点自动纳入 CSRF 防护、如何迁移serial.*配置块与 blocklist 命名、如何配合新版终端日志前缀/更新过滤器正则以及为何现在正是把插件构建迁移到pyproject.toml的最佳时机。写在最前这份清单看起来很长但别被吓到官方迁移文档开篇就强调这份清单罗列了 2.0.0 中所有可能需要插件或客户端做出调整的变更但绝大多数插件只需改动一两处有些甚至完全不需要改动。是否受影响高度取决于你插件的实现方式与复杂度。即便如此即便你的插件不受任何破坏性变更影响也请务必阅读两节内容迁移插件到 pyproject.toml 与构建隔离当前已存在弃用警告的即将移除项清单本文接下来按服务端 → 客户端 → API → 项目组织的顺序完整覆盖官方文档全部条目并给出仓库源码级的佐证。服务端变更访问控制Access controloctoprint.access.users.*的方法重命名octoprint.access.users模块中的UserManager、FilebasedUserManager、User与SessionUser移除了大量长期弃用且已有替代品的方法。以 src/octoprint/access/users.py 中的实际定义为准迁移后的新方法名如下octoprint.access.users.UserManager源码见 src/octoprint/access/users.py#L44旧方法新方法checkPasswordcheck_passwordaddUseradd_userchangeUserActivationchange_user_activationchangeUserPasswordchange_user_passwordgetUserSettingget_user_settinggetAllUserSettingsget_all_user_settingschangeUserSettingchange_user_settingchangeUserSettingschange_user_settingsremoveUserremove_userfindUserfind_usergetAllUsersget_all_usershasBeenCustomizedhas_been_customizedchangeUserRoleschange_user_permissionsaddRolesToUseradd_permissions_to_userremoveRolesFromUserremove_permissions_from_useroctoprint.access.users.FilebasedUserManager源码见 src/octoprint/access/users.py#L408旧方法新方法generateApiKeygenerate_api_keydeleteApiKeydelete_api_keyaddUseradd_userchangeUserActivationchange_user_activationchangeUserPasswordchange_user_passwordgetUserSettingget_user_settinggetAllUserSettingsget_all_user_settingschangeUserSettingchange_user_settingchangeUserSettingschange_user_settingsremoveUserremove_userfindUserfind_usergetAllUsersget_all_usershasBeenCustomizedhas_been_customizedoctoprint.access.users.User源码见 src/octoprint/access/users.py#L919旧成员新用法asDictas_dictis_admin/is_user/roles改为检查具体权限见下方示例其中is_admin、is_user这类基于角色字符串的判断官方推荐改用权限系统Permissions定义在 src/octoprint/access/permissions.py#L270from octoprint.access.permissions import Permissions # instead of user.is_admin: is_admin user.has_permission(Permissions.ADMIN) # preferred! is_admin admin in user.groups # instead of user.is_user: is_user not user.is_anonymous # preferred! is_user user in user.groupsoctoprint.access.users.SessionUser源码见 src/octoprint/access/users.py#L1172旧成员新成员get_sessionsessionoctoprint.users模块被移除octoprint.users已长期弃用2.0.0 中正式删除。请将导入改为octoprint.access.users# old from octoprint.users import UserManager # new from octoprint.access.users import UserManageroctoprint.server.admin_permission与octoprint.server.user_permission被移除这两个权限辅助对象同样在 2.0.0 被移除。官方给出的即插即用替代方案是使用基于组的权限对象from octoprint.access import groups admin_permission groups.GroupPermission(groups.ADMIN_GROUP) user_permission groups.GroupPermission(groups.USER_GROUP)不过官方强烈建议进一步思考针对你的具体用例是否更适合使用更细粒度甚至自定义权限的权限方案。ADMIN_GROUP/USER_GROUP的定义位于 src/octoprint/access/groups.py。文件存储与可打印文件octoprint.filemanager.FileDestinations.SDCARD的值改变FileDestinations.SDCARD的枚举值从printer改为sdcard。任何与硬编码字符串printer比较的插件都会失效。查看源码 src/octoprint/filemanager/destinations.py 可确认现状class FileDestinations: LOCAL local PRINTER printer # for reasons of backwards compatibility SDCARD PRINTER注意源码中SDCARD PRINTER值仍为printer是向后兼容的过渡写法而 2.0.0 官方文档明确宣布该枚举值已变为sdcard。迁移时应改用FileDestinations.PRINTER做所有必要的判断from octoprint.storage import FileDestinations if storage FileDestinations.PRINTER: # preferred! # do something if storage FileDestinations.SDCARD: # do somethingUpdatedFiles事件不再携带gcode文件类型存储子系统产生的UpdatedFiles事件 不再针对文件类型gcode触发而只针对printables触发。如果你仍依赖type: gcode的UpdatedFiles事件需要切换到type: printables。插件系统BlueprintPlugin端点自动纳入 CSRF 防护从 OctoPrint 2.0.0 起自 1.8.3 起预告通过BlueprintPluginmixin 提供的端点会自动落入 OctoPrint 的 CSRF 防护 范围。相关实现位于 src/octoprint/server/util/csrf.py。如果这导致你的插件出问题可以通过octoprint.plugin.BlueprintPlugin.csrf_exempt装饰器豁免单个端点class MyPlugin(octoprint.plugin.BlueprintPlugin): octoprint.plugin.BlueprintPlugin.route(/hello_world, methods[GET]) def hello_world(self): # This is a GET request and thus not subject to CSRF protection return Hello world! octoprint.plugin.BlueprintPlugin.route(/hello_you, methods[POST]) def hello_you(self): # This is a POST request and thus subject to CSRF protection. It is not exempt. return Hello you! octoprint.plugin.BlueprintPlugin.route(/hello_me, methods[POST]) octoprint.plugin.BlueprintPlugin.csrf_exempt() def hello_me(self): # This is a POST request and thus subject to CSRF protection, but this one is exempt. return Hello me! def is_blueprint_csrf_protected(self): return True要点GET请求天然不受 CSRF 保护约束POST等写请求默认受保护需要豁免的端点用csrf_exempt()装饰is_blueprint_csrf_protected返回值控制整组端点是否启用 CSRF 保护。PluginSettings.get_plugin_data_folder被移除长期弃用的octoprint.plugin.PluginSettings.get_plugin_data_folder已被删除取而代之的是octoprint.plugin.OctoPrintPlugin.get_plugin_data_folder。实操上把self._settings.get_plugin_data_folder替换为self.get_plugin_data_folder。注意源码实现src/octoprint/plugin/types.py#L108-L123会在返回前os.makedirs确保目录存在def get_plugin_data_folder(self): if self._data_folder is None: raise RuntimeError( self._plugin_data_folder is None, has the plugin been initialized yet? ) import os os.makedirs(self._data_folder, exist_okTrue) return self._data_folder仓库内的内置插件如 announcements、pluginmanager、softwareupdate、appkeys 等均已改用self.get_plugin_data_folder()访问各自数据目录见 src/octoprint/plugins/announcements/init.py#L591、src/octoprint/plugins/softwareupdate/init.py#L128可作为迁移范本。另外如果你实现SettingsPluginmixin 的唯一目的就是访问数据目录那么现在可以把这个 mixin 一并移除。打印机交互Printer interaction本节涉及的Printer类以self._printer形式注入到插件中。Printer类的内部属性改名或移除octoprint.printer.Printer的一些私有属性被重命名或移除。访问过下列属性的插件必须更新名称。注意这些不是即插即用的替换受影响名称如下旧属性新属性_currentZ_last_z_fileManager_file_manager_printerProfileManager_printer_profile_manager_selectedFile_selected_job_comm仍可用但会触发弃用警告且仅当当前连接由内置 serial connector 插件提供时有效替代访问方式见下节以上新名称可在 src/octoprint/printer/standard.py 中找到佐证例如self._last_z、self._selected_job: PrintJob、self._file_manager、self._printer_profile_manager等。需要特别说明官方明确提醒插件不应使用 OctoPrint 内部类上的私有、未文档化属性。但如果你的插件确实依赖了这些实现细节请到 OctoPrint 仓库提交 feature request说明你缺少哪些官方插件接口与文档化内部 API以便官方将其正式支持避免未来再次踩坑。Printer.get_transport已弃用get_transport已被弃用见 src/octoprint/printer/init.py#L937其兼容层仅在当前打印机连接由内置 serial connector 插件提供时才可用。该兼容层计划在未来版本移除。如果你的插件仍依赖self._printer.get_transport官方建议现在就重构自行检查 serial connector然后获取_comm与其_serial对象——同时做好充分的错误检查这些_前缀的私有属性不属于官方插件 APIif self._printer.connection is None or self._connection.connector ! serial: return if hasattr(self._connection, _comm): # this gets you what used to be self._printer._comm... comm self._connection._comm if hasattr(comm, _serial): # ... and this what used to be returned by self._printer.get_transport() serial comm._serial同样若有此类需求请以 feature request 的形式联系官方寻找不依赖实现细节的官方支持方案。终端日志行格式改变由串口连接产生的终端日志行不再带Recv:与Send:前缀而是改用与。任何消费这些日志的解析器都必须更新。内置默认终端过滤器已同步更新其正则同时匹配新旧两种前缀因此对第三方插件可能仍以旧格式输出的日志也能正常工作。旧版与新版的默认正则对照如下表名称旧默认正则OctoPrint 2.0.0 默认正则Suppress temperature messages(Send: (N\d\s)?M105)\|(Recv:\s(ok\s([PBN]\d\s)*)?([BCLPR]\|T\d*):-?\d)((Send:\|)\s(N\d\s)?M105)\|((Recv:\|)\s(ok\s([PBN]\d\s)*)?([BCLPR]\|T\d*):-?\d)Suppress SD status messages(Send: (N\d\s)?M27)\|(Recv: SD printing byte)\|(Recv: Not SD printing)((Send:\|)\s(N\d\s)?M27)\|((Recv:\|)\sSD printing byte)\|((Recv:\|)\sNot SD printing)Suppress position messages(Send:\s(N\d\s)?M114)\|(Recv:\s(ok\s)?X:[-]?([0-9]*[.])?[0-9]\sY:[-]?([0-9]*[.])?[0-9]\sZ:[-]?([0-9]*[.])?[0-9]\sE\d*:[-]?([0-9]*[.])?[0-9]).*((Send:\|)\s(N\d\s)?M114)\|((Recv:\|)\s(ok\s)?X:[-]?([0-9]*[.])?[0-9]\sY:[-]?([0-9]*[.])?[0-9]\sZ:[-]?([0-9]*[.])?[0-9]\sE\d*:[-]?([0-9]*[.])?[0-9]).*Suppress wait responsesRecv: wait(Recv:\|)\swaitSuppress processing responsesRecv: (echo:\s*)?busy:\s*processing(Recv:\|)\s(echo:\s*)?busy:\s*processing新过滤器的默认配置同样体现在仓库的 src/octoprint/settings/init.py#L1863-L1867 与 src/octoprint/schema/config/terminalfilters.py 中可作为核对基准。如果你的插件自定义了终端过滤器请参照上表同步更新正则。octoprint.printer.profile.BedTypes被移除长期弃用的octoprint.printer.profile.BedTypes类型已移除其即插即用替代品是命名更贴切的octoprint.printer.profile.BedFormFactor。服务器Serveroctoprint.server.util.flask.(admin|user)_validator被移除octoprint.server.util.flask.admin_validator与octoprint.server.util.flask.user_validator均被移除统一改用octoprint.server.util.flask.permissions_validator相关代码位于 src/octoprint/server/util/flask.py。设置Settingsserial.*配置块已迁移设置 schema 中的serial块迁移到了plugins.serial_connector因为它现在由该内置插件管理。如果你的插件访问任何serial相关设置需要调整访问路径。多数情况下只需把serial.*路径替换为plugins.serial_connector.*但以下情况例外旧路径新路径serial.portprinterConnection.preferred.parameters.portserial.baudrateprinterConnection.preferred.parameters.baudrateserial.autoconnectprinterConnection.autoconnectserial.autorefreshprinterConnection.autorefreshserial.autorefreshIntervalprinterConnection.autorefreshIntervalserial.notifySuppressedCommandsfeature.notifySuppressedCommandsserial.alwaysSendChecksum、serial.neverSendChecksumplugins.serial_connector.sendChecksum取值always或neverserial.disconnectOnErrors、serial.ignoreErrorsFromFirmwareplugins.serial_connector.errorHandling取值disconnect或ignoreserial.blacklistedPortsplugins.serial_connector.blacklistedPorts另见下方 blocklist 小节serial.blacklistedBaudratesplugins.serial_connector.blacklistedBaudrates另见下方 blocklist 小节仓库中 serial connector 插件的设置迁移逻辑可见于 src/octoprint/plugins/serial_connector/init.py#L102-L172例如将disconnectOnErrors/ignoreErrorsFromFirmware映射为errorHandlingdisconnect/ignore/cancel将alwaysSendChecksum/neverSendChecksum映射为sendChecksumalways/never/print。其 schema 定义在 src/octoprint/plugins/serial_connector/config_schema.py其中errorHandling默认disconnect、sendChecksum默认print、blocklistedPorts: list[str]、blocklistedBaudrates: list[int]。注意目前存在兼容层代为执行这些映射但请尽快迁移你的插件以免在下一次弃用清理周期中被波及。blacklist/whitelist 改为更具包容性的 blocklist/allowlist以下包含 blacklist 或 whitelist 的路径名已迁移到更包容的 blocklist/allowlist 措辞调用代码应相应调整旧路径新路径feature.autoUppercaseBlacklistfeature.autoUppercaseBlocklistserver.pluginBlacklistserver.pluginBlocklistserial.blacklistedPortsplugins.serial_connector.blocklistedPorts另见上文 serial 小节serial.blacklistedBaudratesplugins.serial_connector.blocklistedBaudrates另见上文 serial 小节同样存在兼容层代为映射但官方强烈建议尽快迁移。octoprint.settings.Settings._config被移除长期弃用的octoprint.settings.Settings._config字段已被移除。如需读取其旧值请改用config属性。写入应极力避免若万不得已可通过_map.topmap完成。工具函数Utiloctoprint.util中以下长期弃用方法发生变化octoprint.util.bom_aware_open移除改用带-sig后缀的编码自动处理 BOM例如with open(filename, encodingutf-8-sig, moder) as f: # do somethingoctoprint.util.dict_clean移除改用octoprint.util.dict_sanitizeoctoprint.util.to_str移除改用octoprint.util.to_bytesoctoprint.util.to_native_str移除改用octoprint.util.to_unicodeoctoprint.util.commandline.clean_ansi不再接受bytes输入调用前请先转换为stroctoprint.util.json.dump移除改用octoprint.util.json.dumps。客户端变更ViewmodelsusersViewModel被移除usersViewModel早已弃用它只是accessViewModel.users的转发。请直接改用后者作为即插即用替代。FilesViewModel.requestData不再支持旧调用签名以(focus, switchToPath, force)参数列表调用FilesViewModel.requestData不再受支持。请改用单个params参数const params { focus: undefined, switchToPath: undefined, force: false } self.filesViewModel.requestData(params);FilesViewModel.fromResponse签名改变FilesViewModel.fromResponse现在要求以(response, params)两个参数调用与requestData的改动保持一致。SettingsViewModel.requestData不再支持旧调用签名以callback参数调用SettingsViewModel.requestData不再受支持请改用返回的 Promiseself.settingsViewModel.requestData() .done((response) { // do something });onWizardTabChange被移除该回调早已被onBeforeWizardTabChange取代如果插件仍使用旧名称请直接切换。JS Client已移除的 API 端点客户端以下 JS Client 组件被移除旁边是既有替代品已移除组件替代组件OctoPrintClient.logsOctoPrintClient.plugins.loggingOctoPrintClient.usersOctoPrintClient.access.usersOctoPrintClient.getRequestHeaders不再支持旧调用签名以额外 headers 作为第一个参数调用OctoPrintClient.getRequestHeaders不再受支持调用方需要通过additional参数添加额外 headers。示例const headers OctoPrintClient.getRequestHeaders( POST, {Some-Header: Some Value} )OctoPrintClient.deprecatedMethod被移除若插件使用该方法请改用OctoPrintClient.deprecated。OctoPrintClient.deprecatedVariable签名改变若插件使用该方法请按新签名调整调用参数具体细节参见OctoPrintClient.deprecatedVariable的文档。API 变更全局 API Key 不再自动生成全局 API KeyGlobal API Key已弃用一段时间2.0.0 起启动时不再自动生成因此可能为空并将在 2.1.0 彻底移除。插件代码需要调用 OctoPrint API 端点时应改用self.plugin_apikey。示例import octoprint.plugin import requests class MyPlugin(octoprint.plugin.StartupPlugin): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._port 5000 def on_startup(self, host, port, *args, **kwargs): self._port port def fetch_api_version(self, **kwargs): url fhttps://localhost:{self._port}/api/version headers { X-Api-Key: self.plugin_apikey } return requests.get(url, headersheaders, timeout5)plugin_apikey由插件系统注入到每个插件实例是官方推荐的、作用域限定于本插件的 API 访问凭证。/api/logs/*、/api/users/*与/api/plugin/pluginmanager被移除以下长期弃用的 API 端点已被移除旁边是既有替代品已移除端点替代端点/api/logs/*/plugin/logging/logs/*/api/users/*/api/access/users/*/api/plugin/pluginmanager/plugin/pluginmanager/(plugins|orphans|repository)仍依赖旧端点的客户端必须切换到新端点。用户响应中的admin与user字段被移除与用户相关的 API 响应不再包含admin和user字段。仍可从返回的groups中推断这两个信息。Settings API 的权限检查更细粒度Settings 检索端点 现在只返回用户按其权限实际需要的设置拥有SETTINGS_READ权限时只返回前端相关设置用户无法写入的后端设置一概不返回拥有SETTINGS权限时返回大部分后端相关设置但访问控制相关设置与已弃用的全局 API Key 相关设置除外这两类需要ADMIN权限数据模型仍完整返回但受限值会置为null单值或空列表列表。这印证了权限系统的细粒度设计SETTINGS_READ、SETTINGS与ADMIN均定义在 src/octoprint/access/permissions.py 中。项目组织变更依赖变化netifaces与passlib不再是 OctoPrint 的依赖。任何导入它们却没有将其声明为额外依赖的插件将无法再使用。如果你的插件依赖这两个第三方库的功能必须在插件的setup.py或pyproject.toml中显式声明它们为依赖。pyproject.toml与构建隔离现在正是把插件从旧的setup.py构建方式迁移到 pyproject.toml 与构建隔离 的好时机。仓库中docs/plugins/examples/helloworld/下的示例插件含pyproject.toml与Taskfile.yml可作参考范本。也为即将到来的移除做准备在动手迁移的同时请一并处理那些已有弃用警告的即将移除项。完整清单参见 当前弃用项列表。提前处理这些警告可以避免未来再一次经历大规模迁移。迁移检查清单速查为便于对照执行这里汇总官方文档的全部要点访问控制octoprint.access.users.*方法全部改为 snake_caseoctoprint.users导入改octoprint.access.usersadmin_permission/user_permission改GroupPermission(ADMIN_GROUP/USER_GROUP)或更细粒度权限。文件存储FileDestinations.SDCARD值已变化改用FileDestinations.PRINTERUpdatedFiles只发printables类型。插件系统BlueprintPlugin端点自动受 CSRF 保护必要时用csrf_exempt()豁免self._settings.get_plugin_data_folder改self.get_plugin_data_folder()。打印机交互私有属性按新名称更新get_transport改为自行探测 serial connector 的_comm._serial终端日志前缀改为/同步更新过滤器正则BedTypes改BedFormFactor。服务器admin_validator/user_validator改permissions_validator。设置serial.*迁移到plugins.serial_connector.*含例外映射表blacklist/whitelist 改 blocklist/allowlistSettings._config改config属性。工具bom_aware_open/dict_clean/to_str/to_native_str/json.dump按对应替代品迁移clean_ansi只接受str。客户端usersViewModel改accessViewModel.usersrequestData统一使用params参数fromResponse(response, params)settingsViewModel.requestData()用 PromiseonWizardTabChange改onBeforeWizardTabChangeJS Client 移除项按表替换。API插件内改用self.plugin_apikey日志/用户/插件管理端点按表切换用户响应去掉admin/user字段Settings API 权限分级返回。项目组织显式声明netifaces/passlib依赖迁移到pyproject.toml与构建隔离。前瞻处理 deprecations.md 中已有的弃用警告项。最后再次强调官方建议即便上述条目与你无关也请尽快落实pyproject.toml迁移与弃用警告清理让插件在未来的版本迭代中持续可用。赞分享物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载相关推荐PyTorch Lightning 1.9 版本迁移完全指南从废弃 API 到现代化训练实践PyTorch Lightning 1.9 版本迁移完全指南从废弃 API 到现代化训练实践 导读 本指南面向需要从 PyTorch Lightning 1.人工智能深度学习机器学习预训练分布式训练微调终极IQKeyboardManager弃用API完全指南从废弃方法到迁移策略终极IQKeyboardManager弃用API完全指南从废弃方法到迁移策略 IQKeyboardManager是iOS开发中解决键盘遮挡问题的高效库能自动移动开发UI组件Ceph mgr cli_api 模块实战指南用 CLI 命令调用 ceph-mgr Python API 与性能基准测试Ceph mgr cli_api 模块实战指南用 CLI 命令调用 ceph mgr Python API 与性能基准测试 Ceph 的 cli_api 是存储分布式文件系统对象存储后端高可用上一篇哔哩下载姬DownKyi完整使用教程从零基础到高手速成下一篇Unity游戏汉化神器XUnity.AutoTranslator完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。