Web框架——Flask系列之请求上下文与应用上下文&请求钩子&Flask-Script扩展命令行(十七)

一、请求上下文和应用上下文

在这里插入图片描述

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

  2. 应用上下文(application context)
    current_app和g都属于应用上下文对象。
    current_app:表示当前运行程序文件的程序实例。
    g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量

二、请求钩子

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

  1. before_first_request:在处理第一个请求前运行。
@app.before_first_request
  1. before_request:在每次请求前运行。

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

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

from flask import Flask,session
app = Flask(__name__)
@app.route("/index",methods=["GET","POST"])
def index():
    print("index 被执行")
    return "index 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):
    '''无论视图函数中有没有出现异常,每次请求(视图函数处理)之后都被执行'''
    print("handle_teardown_request 被执行")
    return response
if __name__ == '__main__':
    app.run(debug=True)

在这里插入图片描述

通过判断请求路径url 来让钩子函数根据视图的不同执行不同的处理函数:

from flask import Flask,request,url_for
app = Flask(__name__)
@app.route("/index",methods=["GET","POST"])
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):
    '''无论视图函数中有没有出现异常,每次请求(视图函数处理)之后都被执行'''
    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(debug=True)

在这里插入图片描述

三、Flask-Script扩展命令行

pip install Flask-Script
在这里插入图片描述

from flask import Flask
from flask_script import Manager

app = Flask(__name__)

manager = Manager(app)

@app.route('/')
def index():
    return '床前明月光'

if __name__ == "__main__":
    manager.run()    ...

Terminal 终端中运行:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44827418/article/details/106579570