Table of Contents
01上下文
背景:可以直接从request对象获取参数
Django是通过视图函数传入request对象,属于局部变量:
def index(request): |
Flask中request是全局变量,多个线程操作同一资源会有竞争问题。如何区分不同用户的请求:与其执行的上下文环境有关系,彼此相互隔离
上下文主要有:请求上下文、应用上下文
请求上下文:用线程编号作为键,再在里面包含字典数据,使用起来就像线程的局部变量
Session也是请求上下文
应用上下文:current_app
操作全局app对象,其实是当前所在的整个应用
g也是应用上下文,导入g处理请求,临时存储对象,每次请求都会重置清空这个变量
如登陆用户名可通过对象新增属性进行保存
from flask import g |
#可替代session["name"]="python" g.username="zhangsan" |
在一次请求之内通过g传参
@app.route('/login') def login(): g.username="zhangsan" say_hello() return "login success"
def say_hello(): name=g.username return "hello %s" % name |
02请求钩子
Flask支撑4种请求钩子hook,通过装饰器实现:
#每次请求都执行 @app.before_request def is_login(): if request.path == "/login": return None
if not session.get("user"): return redirect("/login") |
#每次请求处理无异常顺利完成后 @app.after_request def foot_log(response): if request.path != "/login": print("有客人访问了",request.path) return response |
#第一次请求处理前执行 @app.before_first_request |
#每次请求处后,无论是否异常 @app.teardown_request def handle_teardown_request(response): print(request.path) print("handle_teardown_request执行") return response |
04 Flask-script扩展命令行
pip install Flask-script |
from flask_script import Manager |
Manager:启动命令的管理类。创建管理类的对象:
manager=Manager(app) |
通过管理对象启动:
if __name__ == '__main__': manager.run() |
启动可选参数有shell、runserver
python flask.py runserver -h 0.0.0.0 -p 8000 |