API 是什么(Press 语境下)

一句话总结

程序之间的”菜单”。Press UI 点按钮 → 调 API → API 查数据库或触发操作 → 返回结果。人和人之间用自然语言,程序和程序之间用 API。


🤔 为什么会有它 / 解决了什么问题

没有 API 的话,Press UI 的每个按钮背后都需要有人手动敲命令行。比如你在 UI 点”New Site”,得有人 SSH 到 f1 上跑 bench new-site。API 让 UI 可以直接调用后端函数——点按钮 → API 自动执行 → 返回结果。

它也解决了”不同程序之间怎么通信”的问题。Press UI(前端,JavaScript)和 Press 后端(Python,Frappe)是两个完全不同的程序,它们通过 API 对话。


🔍 具体原理 / 运作逻辑

API 就是一个 URL 地址,你访问它,它返回 JSON 数据或者执行操作。比如:

GET  https://press.getgrowth.app/api/method/ping
     → {"message": "pong"}

POST https://press.getgrowth.app/api/method/press.api.site.new
     → 在 f1 上创建站点 → 返回 {"message": "Site created"}

Press 的 API 是 Frappe 框架自带的。site.py 里的每个带 @frappe.whitelist() 装饰器的函数,就是一个 API 端点。Press UI 的 JavaScript 代码调这些端点,拿到数据渲染页面。


🧭 什么情况下会用到 / 什么场景会遇到它

  • 在 Press UI 点任何按钮 → 背后都是 API 调用
  • curl https://press.getgrowth.app/api/method/ping → 手动测 API
  • 将来 Agent 调外部工具的 MCP 接口时 → 也是调 API
  • bench console 里 frappe.get_all(...) → 本质和 API 里查数据库是一样的操作

⚖️ 副作用 / 代价 / 取舍

  • API 函数的过滤逻辑(如 public=1)如果写死了,数据查不到不会报错——只会返回空列表,不容易排查
  • 自建 Press 绕过 UI 直接用 console 操作时,跳过了 API 层的创建函数,那些函数里写死的参数(如 public=1)就不会生效

🕰️ 来历

  • 计算机领域的基础概念,不是某个公司发明的
  • Press 的 API 基于 Frappe 框架的 @frappe.whitelist() 机制
  • site.py 里的 API 是 frappe/press 仓库的一部分,官方和我们用的是同一份代码

🔗 关联 / 经常一起出现的概念

  • site.py:Press app 里定义 API 函数的文件。get_available_versions()new() 等都是 API 函数。补丁改的就是这个文件的 API 内部逻辑
  • Frappe Whitelist@frappe.whitelist() 装饰器,标记一个 Python 函数可以被外部 HTTP 请求调用
  • Agent Job:Press 通过 API 创建 Agent Job,Agent 拉取后执行。API 是”传令的”,Agent 是”干活的”

⚠️ 注意事项 / 常见误区

  • Press API 和 Agent 之间的 WebSocket 通信不是一回事。API 是 HTTP(请求-响应),Agent 是 WebSocket(长连接推送)
  • API 函数里的过滤条件改动了,不会报错——只会静默返回空数据。site.py 下拉框全空的排查难点就在这里

📎 记忆锚点

API = 餐厅菜单。你(Press UI)看点菜(调 API),厨房(后端)做菜(查数据库/执行操作),做好端出来(返回 JSON)。你不用进厨房,厨房不用见你。


📝 更新日志

日期改动原因
2026-07-08首次创建名词科普