钩子扩展点¶
描述¶
这个扩展点缩写为hep。
这个扩展点工作在Flask钩子函数中,当前支持三种钩子:
before_request
发生在请求之前(允许拦截请求)
after_request
发生在请求后(无异常时)
teardown_request
发生在请求后(即使遇到了异常)
before_first_request
注册一个函数,在应用程序实例的第一个请求之前运行。
后续会支持其他钩子,如果使用了当前版本不支持的钩子,将会触发异常 PEPError
插件需要通过register返回hep字段,返回的hep数据类型是一个格式为{hook_name: callable}的字典,它可以有多个hep_name
Flask-PluginKit通过 _hep_handler()
加载hep,这个方法会检测hep规则和内容。
与tep类似,在整个Web应用程序中,每个hook_name都有许多值。
在使用时,用户不用关心如何调用,因为Flask-PluginKit在初始化时已经注册了钩子处理程序,但应该注意不同的钩子类型处理程序有不同的要求:
before_request
这很简单,任何回调函数、类方法等都可以使用,没有参数,但这里的钩子函数有一个特殊的地方。 众所周知,对于Flask,如果before_request返回值不是None,则请求将被终止。 因此Flask-PluginKit将尝试检测钩子函数的返回值,如果它不是None,将返回,此时请求终止。
after_request
将传递 response 参数,这是Web应用程序的响应数据,是
Response
的一个实例,对应这个钩子的函数可以得到response,不过不能返回response,当然也可以返回,不过Flask-PluginKit目前不会处理你的返回。teardown_request
与after_request类似,当Web异常发生时,此钩子由Flask触发。Flask-PluginKit将 exception 传递给相应的钩子函数。
before_first_request
参考before_request,仅在应用启动后运行一次,没有返回值。
示例¶
注册hep
from flask import request, g, current_app
def set_login_state():
g.login_in = request.args.get("username") == "admin" and \
request.args.get("password") == "admin
def record_access_log(response):
log = {
"status_code": response.status_code,
"method": request.method,
"ip": request.headers.get('X-Real-Ip', request.remote_addr),
"url": request.url,
"referer": request.headers.get('Referer'),
"agent": request.headers.get("User-Agent"),
"login_in": g.login_in
}
current_app.logger.info(log)
def register():
return dict(
hep=dict(
before_request=set_login_state,
after_request=record_access_log
)
)
如上所述,在程序运行之后,将在每个请求之前执行 set_login_state 函数,并且在请求返回之前将执行 record_access_log 函数。