钩子扩展点

描述

这个扩展点缩写为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 函数。