一、请求上下文和应用上下文
-
请求上下文(request context)
request和session都属于请求上下文对象。 -
应用上下文(application context)
current_app和g都属于应用上下文对象。
current_app:表示当前运行程序文件的程序实例。
g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。
二、请求钩子
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
- before_first_request:在处理第一个请求前运行。
@app.before_first_request
-
before_request:在每次请求前运行。
-
after_request(response):如果没有未处理的异常抛出,在每次请求后运行。
-
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/0return "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.pathif path == url_for("index"):print("这是在请求钩子中,判断请求的视图逻辑:index")elif path == url_for("hello"):print("这是在请求钩子中,判断请求的视图逻辑:hello")print("handle_teardown_request 被执行")return responseif __name__ == '__main__':app.run(debug=True)
三、Flask-Script扩展命令行
pip install Flask-Script
from flask import Flask
from flask_script import Managerapp = Flask(__name__)manager = Manager(app)@app.route('/')
def index():return '床前明月光'if __name__ == "__main__":manager.run() ...
Terminal 终端中运行: