Flask 使用 _app_ctx_stack

2021-08-11 21:20 更新

在上面的例子中,在每個請求之前,一個 sqlite3_db 被分配到 _app_ctx_stack.top 。在一個視圖函數(shù)中,這個變量可以使用 SQLite3 的屬性 connection 來訪問。在請求銷毀時, sqlite3_db 連接被關(guān)閉。 通過使用這個模式, 相同 的 sqlite3 數(shù)據(jù)庫連接在請求期間對任何需要它的東 西都是可訪問的。

如果 _app_ctx_stack 因為用戶使用了老版本的 Flask 不存在, 建議退化到限定在請求中的 _request_ctx_stack 。

銷毀行為

這只在你想要支持 Flask 0.6 和更老版本時有關(guān)

由于在 Flask 0.7 中關(guān)于在請求的最后運行的函數(shù)的變更,你的應(yīng)用需要在此格外 小心,如果要繼續(xù)支持 Flask 的更老版本。下面的模式是一個兼顧新舊的好方法:

def close_connection(response):
    ctx = _request_ctx_stack.top
    ctx.sqlite3_db.close()
    return response

if hasattr(app, 'teardown_request'):
    app.teardown_request(close_connection)
else:
    app.after_request(close_connection)

嚴格地講,上面的代碼是錯誤的,因為銷毀函數(shù)接受異常且典型地不返回任何東西。 盡管如此,因為返回值被丟棄,這剛好會工作,假設(shè)中間的代碼不觸碰傳遞的參數(shù)。

他山之石,可以攻玉

本文檔只接觸了擴展開發(fā)中絕對的最小部分,如果你想要了解更多,一個非常好的 主意是查看 Flask Extension Registry 上已有的擴展。如果你感到失落,也有 郵件列表IRC 頻道 來獲取一些漂亮 API 的想法。特別是當(dāng)你在做之前 沒人做過的東西,這會是一個非常好的主意來獲得更多投入。這不僅獲得人們會想 從擴展中得到什么的想法,也可避免多個開發(fā)者重復(fù)發(fā)明輪子。

記?。毫己玫?API 設(shè)計是困難的,所以請在郵件列表里介紹你的項目,讓 其它開發(fā)者在 API 設(shè)計上助你一臂之力。

最好的 Flask 擴展是那些為 API 共享通用風(fēng)格的擴展,并且這只在起初就協(xié)作時 奏效。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號