Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)

本文深入解析Flask框架的请求上下文与应用上下文概念,详细介绍了request和session、current_app和g对象的作用。同时,全面阐述了Flask的四种请求钩子:before_first_request、before_request、after_request和teardown_request的使用场景及执行逻辑。此外,文章还演示了如何根据不同路径进行差异化处理,并介绍了Flask-Script扩展命令行的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.请求上下文与应用上下文

   请求上下文(request context) request和session都属于请求上下文对象。

    应用上下文(application context) current_app和g都属于应用上下文对象。

       current_app:表示当前运行程序文件的程序实例。

        g对象:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。

2.请求钩子

    请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

(1) before_first_request:在处理第一个请求前运行。  :    装饰器: @app.before_first_request

(2) before_request:在每次请求前运行。                              装饰器: @app.before_request

(3) after_request(response):如果没有未处理的异常抛出,在每次请求后运行。 装饰器: @app.after_request

 (4) teardown_request(response):在每次请求后运行,即使有未处理的异常抛出。

           装饰器: @app.teardown_request

注意,after_request和 teardown_request需要接受参数而且还要有返回值

 如果视图函数中有异常,则after_request就不会执行,

不管视图函数有没有异常都会去执行,前提是app.run(debug=False)

 

from flask import Flask, request, url_for

app = Flask(__name__)


@app.route("/index")
def index():
    print("index 被执行")
    a = 1 / 0
    return "index page"


@app.route("/hello")
def hello():
    print("hello 被执行")
    return "hello page"


@app.before_first_request
def handle_before_first_request():
    """在第一次请求处理之前先被执行"""
    print("handle_before_first_request 被执行")


@app.before_request
def handle_before_request():
    """在每次请求之前都被执行"""
    print("handle_before_request 被执行")


@app.after_request
def handle_after_request(response):
    """在每次请求(视图函数处理)之后都被执行, 前提是视图函数没有出现异常"""
    print("handle_after_request 被执行")
    return response


@app.teardown_request
def handle_teardown_request(response):
    """在每次请求 (视图函数处理)之后都被执行, 无论视图函数是否出现异常,都被执行, 工作在非调试模式时 debug=False"""
    print("handle_teardown_request  被执行")
    return response


if __name__ == '__main__':
    app.run()

 访问:127.0.0.1:5000/index    ,  我们事先就在视图函数里面定义了一个错误

  访问之后,回到程序就可以看到 handle_after_request 没有被执行

 

 3. 针对于路径的不同,可以进行不同的处理和逻辑

    定义一个视图函数,设置路径,然后在handle_teardown_request里面判断路径,针对于不同的路径,做相应的处理

from flask import Flask, request, url_for

app = Flask(__name__)


@app.route("/index")
def index():
    print("index 被执行")
    a = 1 / 0
    return "index page"


@app.route("/hello")
def hello():
    print("hello 被执行")
    return "hello page"


@app.before_first_request
def handle_before_first_request():
    """在第一次请求处理之前先被执行"""
    print("handle_before_first_request 被执行")


@app.before_request
def handle_before_request():
    """在每次请求之前都被执行"""
    print("handle_before_request 被执行")


@app.after_request
def handle_after_request(response):
    """在每次请求(视图函数处理)之后都被执行, 前提是视图函数没有出现异常"""
    print("handle_after_request 被执行")
    return response


@app.teardown_request
def handle_teardown_request(response):
    """在每次请求 (视图函数处理)之后都被执行, 无论视图函数是否出现异常,都被执行, 工作在非调试模式时 debug=False"""
    print("handle_teardown_request  被执行")
    path = request.path            # request.path 请求的路径
    # 判断请求的逻辑
    if path == url_for("index"):
        print("在请求钩子中判断请求的视图逻辑: index")
    elif path == url_for("hello"):
        print("在请求钩子中判断请求的视图逻辑: hello")
    print("handle_teardown_request 被执行")
    return response


if __name__ == '__main__':
    app.run()

  首先访问127.0.0.1:5000/index

  

 然后访问127.0.0.1:5000/hello

4. Flask-Script 扩展命令行

   (1 ) 导入  from flask_script import Manager    #    Manager 是启动命令的管理类

      创建   manager = Manager()     # 创建Manager管理类的对象

       启动   manager.run()     #  通过管理对象来启动flask   

  (2)  通过脚本的启动方式有两种:

     ①runserver

          python 7.4_flask_script.py runserver(py文件名)    命令的方式开启flask

           python 7.4_flask_script.py runserver -h 0.0.0.0 -p 8000       开启的时候指定ip和端口号

           python 7.4_flask_script.py runserver --help 可以查看更多的命令

      ②   shell

        python 7.4_flask_script.py(py文件名)  shell

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是那个同伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值