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 |