本章节先对钩子函数概念有个初步了解,然后再介绍四种常用到的钩子函数以及使用方法:
`before_first_request`
`before_request`
`context_processor`
`errorhandler`
一、概念
钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。
百度百科
通俗点的解释,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
简单说,钩子作用就是系统核心发送消息到消息处理函数时,消息先要经过钩子函数处理,钩子函数可以优先处理消息。
很多高级语言都有钩子函数(hook)的概念。在Flask中钩子函数是使用特定的装饰器装饰的函数,我们通过特定的装饰器将函数装饰成为钩子函数。项目运行时,系统满足钩子函数的执行条件,会优先执行钩子函数。
二、常用钩子函数&程序演示
1.`before_first_request`:Flask项目第一次部署后会执行的钩子函数。
@app.before_first_request
def first_request():
print('hello world')
2.`before_request`:请求已经到达了Flask,但是还没有进入到具体的视图函数之前调用。一般这个就是在视图函数之前,我们可以把一些后面需要用到的数据先处理好,方便视图函数使用。
@app.before_request
def before_request():
print('在视图函数执行之前执行的钩子函数')
3.`context_processor`:使用这个钩子函数,必须返回一个字典。这个字典中的值在所有模版中都可以使用。这个钩子函数的函数是,如果一些在很多模版中都要用到的变量,那么就可以使用这个钩子函数来返回,而不用在每个视图函数中的`render_template`中去写,这样可以让代码更加简洁和好维护。
@app.context_processor
def context_processor():
# return {"current_user":'zhiliao'}
if hasattr(g,'user'):
return {"current_user":g.user}
else:
return {}
4. `errorhandler`:在发生一些异常的时候,比如404错误,比如500错误。那么如果想要优雅的处理这些错误,就可以使用`errorhandler`来出来。
@app.errorhandler(500)
def server_error(error):
return render_template('500.html'),500
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'),404
@app.errorhandler(400)
def args_error(error):
return '您的参数不正确'
需要注意几点:
* 在errorhandler装饰的钩子函数下,记得要返回相应的状态码。
* 在errorhandler装饰的钩子函数中,必须要写一个参数,来接收错误的信息,如果没有参数,就会直接报错。
* 使用`flask.abort`可以手动的抛出相应的错误,比如开发者在发现参数不正确的时候可以自己手动的抛出一个400错误。
三、参考链接
钩子函数&回调函数:https://blog.csdn.net/lipeionline/article/details/6369657