云计算百科
云计算领域专业知识百科平台

OctoPrint 服务器状态 API 完全指南:`GET /api/server` 返回结构、Safe Mode 判定与源码级实现解析

  • 物联网
  • 后端

【免费下载链接】OctoPrint

OctoPrint is the snappy web interface for your 3D printer!

项目地址:
https://gitcode.com/gh_mirrors/oc/OctoPrint

点击查看 免费下载

GET /api/server 是 OctoPrint 用于查询服务器自身运行状态的只读端点,从 1.5.0 版本开始提供。它返回一个 JSON 对象,包含服务器版本号 version 与安全模式标志 safemode,是监控、告警、自动化脚本判断"OctoPrint 当前是否健康启动"的首选入口。读完本文,你将掌握该端点的请求/响应格式、safemode 三种取值的完整含义与触发链路、以及从 CLI 与配置层面主动控制 Safe Mode 的实战方法。

一、端点概览:功能、版本与权限

GET /api/server 在 docs/api/server.rst 中被正式定义,属于 HTTP API 的只读查询端点:

  • 功能:检索服务器状态信息,返回包含版本号与安全模式状态(及原因)的 JSON 对象;
  • 引入版本:versionadded:: 1.5.0,即自 OctoPrint 1.5.0 起可用;
  • 认证要求:端点由 Permissions.STATUS.require(403) 保护(见 src/octoprint/server/api/init.py),未授权访问将得到 403 Forbidden。这意味着调用方需要具备 API Key(X-Api-Key 请求头)并拥有对应权限;
  • 成功状态码:200 OK,且响应 Content-Type: application/json。

在源码中该端点对应的处理器如下(src/octoprint/server/api/init.py):

@api.route("/server", methods=["GET"])
@Permissions.STATUS.require(403)
def serverStatus():
return jsonify(version=octoprint.server.VERSION, safemode=octoprint.server.safe_mode)

可以看到,实际返回的数据来源于两个全局量:octoprint.server.VERSION(服务器版本)与 octoprint.server.safe_mode(安全模式状态)。与它同组的 /api/version 端点(src/octoprint/server/api/init.py)返回 server、api、text 等字段,二者用途不同:/api/version 偏重版本信息,/api/server 则额外携带了 Safe Mode 状态,这是判断服务器是否"降级启动"的关键信号。

二、请求与响应格式详解

2.1 请求示例

原文档给出的标准请求如下:

GET /api/server HTTP/1.1
Host: example.com
X-Api-Key: abcdef…

要点:

  • 方法固定为 GET,路径为 /api/server;
  • 必须携带 X-Api-Key 请求头(或通过已认证会话),否则返回 403;
  • 无需任何查询参数或请求体。

2.2 响应示例

HTTP/1.1 200 OK
Content-Type: application/json

{
"version": "1.5.0",
"safemode": "incomplete_startup"
}

响应 JSON 仅含两个键:

键类型含义
version string 当前运行的 OctoPrint 服务器版本号,例如 "1.5.0";取自 octoprint.server.VERSION
safemode string / boolean Safe Mode 状态。值为 false 表示未启用安全模式;值为 settings、incomplete_startup 或 flag 时,分别表示启用安全模式的不同原因(详见下文)

从源码看,该 JSON 由 jsonify(version=…, safemode=…) 直接构造(src/octoprint/server/api/init.py),因此字段顺序、命名与文档严格一致,客户端可直接按此契约解析。

2.3 safemode 字段的三种取值

server.rst 明确指出 safemode 的合法取值集合:

  • settings:因配置项 server.startOnceInSafeMode 被置为 true 而进入 Safe Mode。该配置项是一次性的——本次启动启用 Safe Mode 后会被自动重置回 false(见下文源码证据);
  • incomplete_startup:检测到上次启动未完成(存在 .incomplete_startup 标记文件)而进入 Safe Mode,提示用户上次启动可能中途失败;
  • flag:通过命令行参数(如 octoprint serve –safemode)显式强制进入 Safe Mode;
  • false(布尔值):未处于 Safe Mode。
  • 三、Safe Mode 的判定逻辑:源码级追踪

    GET /api/server 中 safemode 的取值并不是临时拼凑的,而是 OctoPrint 启动流程中计算出的全局状态。下面沿着源码逐一还原三种取值的来源。

    3.1 启动时汇总三类来源(src/octoprint/init.py)

    OctoPrint 在初始化阶段(init_settings 之后)会做如下判定:

    settings_start_once_in_safemode = (
    "settings" if settings.getBoolean(["server", "startOnceInSafeMode"]) else None
    )
    settings_incomplete_startup_safemode = (
    "incomplete_startup"
    if os.path.exists(os.path.join(settings._basedir, ".incomplete_startup"))
    and not settings.getBoolean(["server", "ignoreIncompleteStartup"])
    else None
    )
    safe_mode = (
    safe_mode
    or settings_start_once_in_safemode
    or settings_incomplete_startup_safemode
    )

    逻辑解读:

    • settings 来源:读取配置 server.startOnceInSafeMode,若为 true 则标记为 "settings";
    • incomplete_startup 来源:检查基于目录(basedir)下是否存在 .incomplete_startup 标记文件,且配置 server.ignoreIncompleteStartup 不为 true(该配置为开发场景提供跳过机制),命中则标记为 "incomplete_startup";
    • flag 来源:来自外部传入的 safe_mode 参数(由 CLI 的 –safemode 转换而来,见下文),作为第一优先级被合并。

    三者通过逻辑或合并,最终写入 kwargs["safe_mode"],并最终传递为服务器模块的 safe_mode 全局量(src/octoprint/server/init.py),随后被 serverStatus() 读取并序列化输出。

    3.2 .incomplete_startup 标记文件如何产生

    服务器启动时会主动"种下"这个标记(src/octoprint/server/init.py):

    def run(self):
    incomplete_startup_flag = self._get_incomplete_startup_flag()
    if not self._settings.getBoolean(["server", "ignoreIncompleteStartup"]):
    try:
    incomplete_startup_flag.touch()
    except Exception:
    self._logger.exception("Could not create startup triggered safemode flag")
    …

    即在启动流程开始时先创建 .incomplete_startup 标记;当启动成功完成后该标记会被移除,从而形成一个"启动中 → 启动完成"的哨兵机制。若上次启动在完成前异常退出(标记未被清理),下一次启动时第 3.1 节中的 os.path.exists(…) 就会命中,进而自动进入 Safe Mode 并让 GET /api/server 返回 "safemode": "incomplete_startup"。

    3.3 startOnceInSafeMode 的一次性消费

    服务启动后,Safe Mode 配置会被自动复位(src/octoprint/server/init.py):

    if safe_mode and self._settings.getBoolean(["server", "startOnceInSafeMode"]):
    …
    self._settings.setBoolean(["server", "startOnceInSafeMode"], False)

    同时配置 schema 也对这两个关键开关给出了权威注释(src/octoprint/schema/config/server.py):

    startOnceInSafeMode: bool = False
    """If this option is ``true``, OctoPrint will enable safe mode on the next server start and reset the setting to false"""

    ignoreIncompleteStartup: bool = False
    """Set this to ``true`` to make OctoPrint ignore incomplete startups. Helpful for development."""

    这印证了:"settings" 是一次性触发(next start 生效、随后自动重置),而 "incomplete_startup" 可以被 ignoreIncompleteStartup: true 显式忽略——这是开发者日常调试时常用的豁免开关。

    四、如何主动触发 Safe Mode:CLI 与配置两条路径

    除了被动响应 .incomplete_startup,运维者也可以主动让 GET /api/server 返回非 false 的 safemode 值。OctoPrint 提供两条路径:

    4.1 CLI 命令:octoprint safemode

    在 src/octoprint/cli/server.py 中定义了专门的子命令:

    octoprint safemode

    其实现将配置 server.startOnceInSafeMode 置为 true 并保存:

    settings.setBoolean(["server", "startOnceInSafeMode"], True)
    settings.save()
    click.echo("Safe mode flag set, OctoPrint will start in safe mode on next restart.")

    执行后控制台会提示"Safe mode flag set, OctoPrint will start in safe mode on next restart.",即下一次启动时进入 Safe Mode,同时 GET /api/server 将返回 "safemode": "settings"。因为该配置一次性消费,启动完成后会被重置。

    4.2 启动参数:–safemode 标志

    octoprint serve –safemode(或 octoprint –safemode)会走另一条链路(src/octoprint/cli/server.py):

    safe_mode = "flag" if get_value("safe_mode") else None

    该值作为 safe_mode 参数传入 run_server,最终合并进全局状态,使 GET /api/server 返回 "safemode": "flag"。与 "settings" 不同,"flag" 是本次进程级强制启用,不受"一次性重置"逻辑影响。

    4.3 配置文件中的直接控制

    若希望手工写入配置(例如 config.yaml),对应的片段为:

    server:
    startOnceInSafeMode: true # 下次启动进入 Safe Mode,随后自动复位
    ignoreIncompleteStartup: false # 置 true 可忽略未完成启动检测(开发用)

    相关 schema 定义位于 src/octoprint/schema/config/server.py。此外,系统 API 中也存在通过 POST /api/system 类接口写入该配置的路径(src/octoprint/server/api/system.py),可供自动化场景使用。

    五、典型应用场景与使用建议

    综合以上机制,GET /api/server 的典型应用场景包括:

  • 健康监控与启动检查:轮询该端点,若 safemode 为 "incomplete_startup",说明上一次启动异常中断,需检查日志并确认配置与插件状态;
  • Safe Mode 状态判定:"settings" / "flag" 表明服务器处于受控降级状态,第三方插件被停用(Safe Mode 下非内置插件不会加载),此时功能完整性会受限,告警系统可据此提示用户;
  • 版本确认:结合 version 字段做版本兼容性检查,判断是否需要升级或插件是否兼容;
  • 插件排障:当插件导致启动失败时,通过 octoprint safemode 或 –safemode 进入 Safe Mode 后调用该端点确认已生效,再逐步排查插件(docs/features/safemode.rst 对 Safe Mode 特性有完整说明)。
  • 六、小结

    GET /api/server 虽然只返回两个字段,却精准承载了 OctoPrint 最关键的运行健康信号:版本号与 Safe Mode 状态。其 safemode 字段的三种取值 settings、incomplete_startup、flag 分别对应配置一次性触发、上次启动未完成检测、命令行强制启用三条完全不同的链路,均可从 src/octoprint/init.py、src/octoprint/cli/server.py 与 src/octoprint/schema/config/server.py 等源码中得到一一印证。理解了这些内部机制,你就能在自动化脚本、监控面板与故障排障中正确解读该端点返回的每一个值。

    赞

    分享

    • 物联网
    • 后端

    【免费下载链接】OctoPrint

    OctoPrint is the snappy web interface for your 3D printer!

    项目地址:
    https://gitcode.com/gh_mirrors/oc/OctoPrint

    点击查看 免费下载

    上一篇:
    clawhub writing-evals 技能详解:用 createAppScope + Zod 设计 Axiom AI 评测的 Flag Schema

    下一篇:
    SkyWater 130nm开源PDK快速上手实践指南:从零开始构建你的芯片设计环境

    创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » OctoPrint 服务器状态 API 完全指南:`GET /api/server` 返回结构、Safe Mode 判定与源码级实现解析
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!