flask学习笔记(十八)-- 钩子函数

本章节先对钩子函数概念有个初步了解,然后再介绍四种常用到的钩子函数以及使用方法: 

  • `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

猜你喜欢

转载自blog.csdn.net/feit2417/article/details/80735627