Webhook
VeriPress 支持通过接收 webhook 回调来在某些特定外部事件发生时执行自定义 Python 脚本,从而实现例如 GitHub 仓库发生 push 事件就自动拉取最新内容这样的用法。
无论运行模式是 api-only
还是 view-only
还是 mixed
,/_webhook
这个 URL 都可以接收 POST 请求。收到请求后,它会在 VeriPress 实例目录中寻找 webhook.py
文件,如果存在,则会在 Flask 的 request context 下执行这个文件的代码(此为同步执行,如果需要进行长时间的任务,最好开新的线程或进程),不存在则跳过。无论该脚本存在与否最终都返回 204 NO CONTENT
。
「在 Flask 的 request context 下执行」意味着在脚本中可以访问到 Flask 当前请求的 request
对象、g
对象、current_app
对象,也就是说你可以在这里对 POST 请求进行鉴权、使用甚至修改 app 的配置文件等。关于 Flask 的 request context,请参考 Flask 官方文档的 The Request Context。
一段可能的自定义脚本如下:
import os
import subprocess
from flask import request
def check_token():
# 对请求进行鉴权,防止恶意请求
return True
if check_token():
log_file = open('webhook.log', 'a')
subprocess.Popen(['/bin/sh', 'update.sh'], stdout=log_file)