注意:从版本 15 开始,服务器脚本默认被禁用,以提高共享 bench 的安全性。
你可以使用以下命令在你的 bench 上启用它们。
bench set-config -g server_script_enabled 1如果你托管在 Frappe Cloud 上,你需要创建一个私有 bench 才能启用服务器脚本。公共共享 bench 不允许使用服务器脚本。
服务器脚本让你可以动态定义一个 Python 脚本,在文档事件或 API 触发时在服务器上执行。
如何创建服务器脚本
要创建服务器脚本
- 如果你的站点托管在 frappe cloud 上,这里有一篇帮助文章说明了启用服务器脚本的步骤。如果是自托管账户,请在你的站点的 site_config.json 中将
server_script_enabled设置为 true。 - 要添加/编辑服务器脚本,请确保你的角色是系统管理员。
- 在 awesomebar 中输入“新建服务器脚本”并按回车,创建一个新的服务器脚本文档。
- 设置服务器脚本的类型(文档事件 / API)。
- 设置文档类型和事件名称,或方法名称、脚本并保存。
- 功能
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')