一、概念
钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。 --百度百科
通俗点的解释,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
很多高级语言都有钩子函数(hook)的概念。在Flask中钩子函数是使用特定的装饰器装饰的函数,我们通过特定的装饰器将函数装饰成为钩子函数。项目运行时,系统满足钩子函数的执行条件,会优先执行钩子函数。
flask常用的钩子函数
@app.before_first_request #处理第一次请求之前执行
@app.before_request #在每次请求之前执行
@app.teardown_appcontext #不管是否有异常,注册的函数都会在每次请求之后执行
@app.context_processor #上下文处理器。返回的字典中的键可以在模板上下文中使用
@app.errorhandler #errorhandler接收状态码,可以自定义返回这种状态码的响应的处理方法
二、程序演示
from flask import Flask,g
#目的:学习钩子函数hook的使用方法,并结合上下文存储信息
app = Flask(__name__)
#处理第一次请求之前执行
@app.before_first_request
def demo1():
print("demo1 hinzer")
#处理第一次请求之前执行
@app.before_request x
def demo2():
if not hasattr(g, 'username'):
setattr(g, "username", "hinzer") # g对象中设置用户信息
#不管是否有异常,注册的函数都会在每次请求之后执行
@app.teardown_appcontext
def demo3(exc=None):
print("demo3 hinzer")
#上下文处理器。返回的字典中的键可以在模板上下文中使用
@app.context_processor
def demo4():
return {'current_user':'hinzer'}
#errorhandler接收状态码,可以自定义返回这种状态码的响应的处理方法
@app.errorhandler
def page_not_found(error):
return "This page does not exist",404
#视图函数
@app.route('/')
def hello_world():
print("demo2 {}".format(g.username))
return 'Hello World!'
if __name__ == '__main__':
app.run()
PS 需要注意几点:
* 在errorhandler装饰的钩子函数下,记得要返回相应的状态码。
* 在errorhandler装饰的钩子函数中,必须要写一个参数,来接收错误的信息,如果没有参数,就会直接报错。
* 使用`flask.abort`可以手动的抛出相应的错误,比如开发者在发现参数不正确的时候可以自己手动的抛出一个400错误。
参考链接
钩子函数&回调函数:https://blog.csdn.net/lipeionline/article/details/6369657