本文僅為作者自學(xué)之用摇肌,系統(tǒng)為macOS捌肴,不保證信息準(zhǔn)確。
Flask的上下文使用
寫慣了java或者python等oo語言的同學(xué)也許會(huì)煩惱為什么在flask的主文件中不能給app = Flask(__name__)
添加成員變量或者初始化函數(shù)呢?我也好奇這個(gè)問題丢胚,同時(shí)也很希望可以解決這個(gè)需求秧了,可惜并無所獲跨扮。沒有辦法寫成成員變量以及初始化函數(shù)就導(dǎo)致了一個(gè)問題,那就是web.py這個(gè)程序中如果需要實(shí)例化某些類就需要寫在最外層,系統(tǒng)一經(jīng)啟動(dòng)就會(huì)開始運(yùn)行衡创,這樣會(huì)帶來諸多的問題:
- 被初始化的類中若用到了
from flask import current_app
這樣的操作便會(huì)報(bào)錯(cuò)帝嗡,因?yàn)槌跏蓟@個(gè)類的時(shí)候還并沒有真正開啟這個(gè)app,所以current_app
便會(huì)找不到璃氢。這是程序中一個(gè)常見的錯(cuò)誤類型哟玷,A初始化中需要實(shí)例化B,B初始化中又需要實(shí)例化A一也,互相依賴巢寡。 - 如果需要在開啟服務(wù)器的時(shí)候同時(shí)啟動(dòng)新進(jìn)程運(yùn)行后臺(tái)程序,(例如開啟一個(gè)程序從數(shù)據(jù)庫查詢是否有新數(shù)據(jù)椰苟,有的話就抓取并處理讼渊;或者是定時(shí)任務(wù)等)則會(huì)在服務(wù)還未完全開啟時(shí)就開始,會(huì)在某些情況下導(dǎo)致服務(wù)器不存在尊剔,定時(shí)任務(wù)失敗等錯(cuò)誤爪幻。
這里提出的解決方案僅能解決第一種情況,第二種情況如果以后發(fā)現(xiàn)了解決方案也會(huì)補(bǔ)上须误。
這里就要用到app.app_context()
了挨稿。
app = Flask(__name__)
with app.app_context():
db = Database()
re = db.get_redis()
conn = db.get_mongo()
config = Config()
在with app.app_context():
語句下,即便服務(wù)還未真正的跑起來京痢,卻已經(jīng)有了app實(shí)例了奶甘,在這里以app實(shí)例以某種方式傳入其下的類初始化函數(shù)中可以解決這些類中無法讀取current_app
的問題,從而代碼可以正確執(zhí)行祭椰。