服务器脚本

注意:从版本 15 开始,服务器脚本默认被禁用,以提高共享 bench 的安全性。

你可以使用以下命令在你的 bench 上启用它们。

bench set-config -g server_script_enabled 1

如果你托管在 Frappe Cloud 上,你需要创建一个私有 bench 才能启用服务器脚本。公共共享 bench 不允许使用服务器脚本。

服务器脚本让你可以动态定义一个 Python 脚本,在文档事件或 API 触发时在服务器上执行。

如何创建服务器脚本


要创建服务器脚本

  1. 如果你的站点托管在 frappe cloud 上,这里有一篇帮助文章说明了启用服务器脚本的步骤。如果是自托管账户,请在你的站点的 site_config.json 中将 server_script_enabled 设置为 true。
  2. 要添加/编辑服务器脚本,请确保你的角色是系统管理员。
  3. 在 awesomebar 中输入“新建服务器脚本”并按回车,创建一个新的服务器脚本文档。
  4. 设置服务器脚本的类型(文档事件 / API)。
  5. 设置文档类型和事件名称,或方法名称、脚本并保存。
  6. 功能

2.1 启用服务器脚本

服务器脚本必须通过 site_config.json 启用

bench --site site1.local set-config server_script_enabled true

2.2 文档事件

对于要通过文档事件调用的脚本,你必须设置参考文档类型和事件名称来定义触发器

  • 插入前
  • 插入后
  • 验证前
  • 保存前
  • 保存后
  • 提交前
  • 提交后
  • 取消前
  • 取消后
  • 删除前
  • 删除后
  • 保存前(已提交文档)
  • 保存后(已提交文档)
  • 打印前

2.3 API 脚本

通过使用脚本类型 "API",可以即时创建 API 端点。端点的名称取决于API 方法字段。所有使用服务器脚本创建的 API 都会自动加上 /api/method 前缀。

例如,一个API 方法为 "delete-note" 的脚本可以通过 /api/method/delete-note 访问。使用 Frappe 的前端请求库,你可以在客户端脚本中使用 frappe.call("delete-note")。

可以通过为创建的 API 勾选允许访客来启用访客访问。响应可以通过 frappe.response["message"] 对象设置。

API 服务器脚本还支持基于 IP 的速率限制,你可以通过勾选“启用速率限制”并指定在给定时间窗口内可以进行多少次调用来启用它。

2.3 安全性

Frappe 框架使用 RestrictedPython 库来限制对服务器脚本可用方法的访问。只有下面列出的安全方法在服务器脚本中可用。

有关允许的方法,请参阅脚本 API

2.4 将服务器脚本用作库

你可以通过在脚本中设置 frappe.flags 值,将服务器脚本用作内部方法。

2.5 比较更改

你可以使用“比较版本”按钮来对比服务器脚本的两个版本。

示例


3.1 在更改前更改属性的值

脚本类型:保存前

if "test" in doc.description:
    doc.status = 'Closed'

3.2 自定义验证

脚本类型:“保存前”

if "validate" in doc.description:
    raise frappe.ValidationError

3.3. 自动创建待办事项

脚本类型:“保存后”

if doc.allocted_to:
    frappe.get_doc(dict(
        doctype = 'ToDo',
        owner = doc.allocated_to,
        description = doc.subject
    )).insert()

3.4 API

  • 脚本类型:API
  • 方法名称:test_method
frappe.response['message'] = "hello"

请求:/api/method/test_method

3.5 内部库

版本 13 中的新功能

从一个 script_1 脚本调用另一个 script_2

脚本 1:

frappe.flags.my_key = 'my value'

脚本 2:

my_key = run_script('script_1').get('my_key')