用flask开发个人博客(15)—— flask中四种请求钩子

一 引言     

        flask中具有四种钩子被做成了修饰器,我们在后端可以进行调用做相关的操作.使用钩子函数时,我们需要借助flask的全局变量g.g作为中间变量,在钩子函数和视图函数中间传递数据.我们先引入全局变量g

from flask import g

        然后注册一个视图函数,用来显示g中的数据

@app.route('/test')
def test():
    return g.string

二  before_first_request

        注册一个函数,在处理第一个请求之前运行.

@app.before_first_request
def bf_first_request():
    g.string = 'before_first_request'

       运行程序,调用http://localhost:5000/test会显示g中传递的string变量

三 before_request

        注册一个函数,在处理每次请求之前运行.

@app.before_request
def bf_request():
    g.string = 'before_request'

四 after_request

        注册一个函数,在每次请求之后运行.注册的函数至少需要含有一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.

@app.after_request
def af_request(param):
    return param

五 teardown_request

        注册一个函数,同样在每次请求之后运行.注册的函数至少需要含有一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.

@app.teardown_request
def td_request(param):
    return param


Github位置:
https://github.com/HymanLiuTS/flaskTs

克隆本项目:
git clone git@github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL15














### Flask钩子函数与装饰器的关系 在Flask框架内,钩子函数和装饰器紧密关联却又各自具有独特的作用。 #### 钩子函数的概念及其作用 钩子函数是在请求处理的不同阶段插入自定义代码的方式之一。这些函数利用特定的装饰器来标记其行为时机,比如`before_first_request`用于首次HTTP请求到来之前执行某些初始化操作[^1]。通过这种方式,可以在不修改原有业务逻辑的前提下增强应用的功能特性,例如实施全局的日志记录或是用户身份验证措施[^3]。 #### 装饰器的基础理解 装饰器本质上是一个接受另一个函数作为参数并返回新版本该函数的对象,在Python中通常表现为带有`@decorator_name`语法糖的形式。当应用于Flask时,装饰器不仅限于修饰普通的视图函数以添加额外的行为,还专门设计了一些用来注册不同类型的钩子函数的装饰器,如`@app.before_request`等[^4]。 #### 区别与联系 - **区别** - 功能定位上,装饰器是一种编程模式,旨在简化代码复用;而钩子函数则是Web开发中的具体应用场景下的解决方案。 - 使用场景方面,任何地方都可以使用装饰器来包裹任意函数增加功能,但钩子函数特指那些被安排到Web应用程序生命周期特定时刻运行的小程序片段。 - **联系** - 实现方式上,两者都依赖于高阶函数的思想——即把一个函数当作另一函数的数据传递进去。 - 应用层面看,正是由于有了像`@app.route()`这样的路由装饰器以及针对各种事件触发点设置的钩子函数装饰器的存在,才使得开发者能够更加灵活高效地构建复杂的Web服务架构。 ```python from flask import Flask, request app = Flask(__name__) @app.before_first_request def before_first(): """仅第一次请求前调用""" print('This is the first time a request has been made.') @app.before_request def log_request_info(): app.logger.debug('Headers: %s', request.headers) app.logger.debug('Body: %s', request.get_data()) if __name__ == '__main__': app.run() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值