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

 

 

一、概念

钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。      --百度百科

通俗点的解释,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。

 

很多高级语言都有钩子函数(hook)的概念。在Flask中钩子函数是使用特定的装饰器装饰的函数,我们通过特定的装饰器将函数装饰成为钩子函数。项目运行时,系统满足钩子函数的执行条件,会优先执行钩子函数。

 

 

flask常用的钩子函数

@app.before_first_request       #处理第一次请求之前执行
@app.before_request             #在每次请求之前执行
@app.teardown_appcontext        #不管是否有异常,注册的函数都会在每次请求之后执行
@app.context_processor          #上下文处理器。返回的字典中的键可以在模板上下文中使用
@app.errorhandler(404)           #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(404)           
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

 

 

 

你可能感兴趣的:(技术实现-学习&培训&整理)