flask 钩子、上下文对象、flask-script扩展
程序员文章站
2022-07-15 13:19:02
...
一、钩子
请求钩子hook
是通过装饰器的形式实现,Flask支持如下四种请求钩子:
-
before_first_request
:在处理第一个请求前运行。 -
before_request
:在每次请求前运行。 -
after_request(response)
:如果没有未处理的异常抛出,在每次请求后运行。需要参数和返回值 -
teardown_request(response)
:在每次请求后运行,即使有未处理的异常抛出。需要参数和返回值
实例
from flask import Flask
app=Flask(__name__)
@app.route("/index")
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 handele_before_every_request():
"每次请求前都被执行"
print("handele_before_every_request 被执行")
@app.after_request
def handle_after_every_request(response):
"每次视图函数请求后都被执行,但视图函数不能有异常"
print("handle_after_every_request 被执行,返回值%s"%response)
return response
@app.teardown_request
def handle_teardown_request(response):
"每次视图函数请求后都被执行,无论是否有异常"
print("handle_teardown_request 被执行,返回值%s"%response)
return response
if __name__ == "__main__":
app.run(debug=True)
运行:
需要注意的是:
-
teardown_request
应该工作在非调试模式下才会生效。 - 钩子中可以使用
request
对象。
二、上下文
-
请求上下文(
request context
) :每次请求都会根据上下文产生一个对象,这个对象属于全局对象,但多线程调用时会根据线程号调用,所以不会出错。request
和session
都属于请求上下文对象。 -
应用上下文(application context):因程序文件产生的对象。
current_app
和g
都属于应用上下文对象。
current_app:表示当前运行程序文件的程序实例。
g:处理请求时,用于临时存储的对象,每次请求都会重设这个变量。
三、script扩展
pip install Flask-Script
实例:
from flask import Flask
from flask_script import Manager # 启动命令的管理类
app=Flask(__name__)
# 创建Manger管理类的对象
manager = Manager(app)
@app.route("/index")
def index():
print("index被执行")
return "index page"
if __name__ == "__main__":
# app.run(debug=True)
# 通过管理对象启动Flask
manager.run()
启动方式,在终端输入:
python 文件名.py runserver
查看帮助:
python 文件名.py runserver --help