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