- 鉤子函數(shù)
鉤子函數(shù)是指在執(zhí)行函數(shù)和目標(biāo)函數(shù)之間掛載的函數(shù), 框架開發(fā)者給調(diào)用方提供一個point -掛載點(diǎn), 至于掛載什么函數(shù)有我們調(diào)用方?jīng)Q定, 這樣大大提高了靈活性
- 常用的鉤子函數(shù)
-
before_first_request
處理第一次請求之前執(zhí)行
# 服務(wù)器被第一次訪問執(zhí)行的鉤子函數(shù)
@app.before_first_request
def first_request():
print("Hello World")
-
before_request
在每次請求之前執(zhí)行. 通常使用這個鉤子函數(shù)預(yù)處理一些變量, 視圖函數(shù)可以更好調(diào)用
# 在服務(wù)器接收的請求還沒分發(fā)到視圖函數(shù)之前執(zhí)行的鉤子函數(shù)
@app.before_request
def before_request():
# print("我勾住了每次請求")
user_id = session.get("user_id")
if user_id:
g.user = "DaYe"
-
teardown_appcontext
當(dāng)APP上下文被移除之后執(zhí)行的函數(shù), 可以進(jìn)行數(shù)據(jù)庫的提交或者回滾
@app.teardown_appcontext
def teardown(exc=None):
if exc is None:
db.session.commit()
else:
db.session.rollback()
db.session.remove()
@app.template_filter
def upper_filter(s):
return s.upper()
-
context_processor
上下文處理器, 返回的字典可以在全部模板中使用
@app.context_processor()
def context():
# 必須返回一個字典
# hasattr(obj, attr) 判斷obj是否有attr屬性, 注意此時的attr應(yīng)該是字符串
if hasattr(g, "user"):
return {"current_username": "DaYe"}
else:
# 注意: 必須返回一個字典
return {}
-
errorhander
, 在發(fā)生一些異常時, 比如404錯誤, 就會自動調(diào)用對應(yīng)的鉤子函數(shù)
- 發(fā)生請求錯誤時, 框架會自動調(diào)用相對鉤子函數(shù), 并向鉤子函數(shù)傳入
error
參數(shù)
- 如果鉤子函數(shù)沒有定義
error
參數(shù), 就會報服務(wù)器錯誤
- 開發(fā)者可以通過
flask.abort
方法手動拋出異常, 比如發(fā)現(xiàn)輸入的參數(shù)錯誤可以使用abort(404)
來解決
@app.errorhander(404)
def page_not_found(error):
return render_template("error400.html"), 404
@app.errorhander(500)
def server_error(error):
return render_template("error505.html"), 500
以下為授權(quán)協(xié)議. 當(dāng)你引用本文時, 默認(rèn)你同意本協(xié)議.
憑此協(xié)議, 你可以在不通知作者的情況下, 對本文進(jìn)行修改,轉(zhuǎn)發(fā)或者進(jìn)行商業(yè)行為. 但是你無權(quán)修改 ,刪除本協(xié)議.
@Auther: DaYe
@Email: yesongsheng@163.com
@Time: 5/2/2018 15:25
感謝你自覺遵守本協(xié)議
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者