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

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

猜你喜欢

转载自blog.csdn.net/wei18791957243/article/details/85238491