我目前正在嘗試使用python,flask和sqlite編寫一個小型web應用程序,我不確定如何處理數據庫連接。如何在更大的Python/Flask應用程序中組織數據庫連接?
基本上,我一直在關注「官方」的教程(和http://flask.pocoo.org/docs/patterns/sqlite3/#sqlite3),讓我這樣的代碼在我的主要瓶/應用模塊(大大縮短):
@vs_app.before_request
def before_request():
g.db = sqlite3.connect("somedb.db")
def execute_db(command):
return g.db.cursor().execute(command).fetchall()
@app.route("/givemeallusers")
def foo():
return execute_db("SELECT * FROM users")
因此,這將創建一個數據庫 - 連接每個請求,我的應用程序可以使用它來執行sql-commands,並且它適用於較小的應用程序。
但對於一個較大的項目,我想將我的數據庫的代碼(有一些實用的方法),並在不同的模塊,應用程序代碼,所以我可以(例如)寫:
from my_database_module import user_auth #
@app.route("/login")
def foo():
if user_auth(request.form["name"], request.form["pw"]):
pass
但對於我需要從我的數據庫類訪問g(或g.db),並且唯一可以實現這種功能的方法是通過「手動」將db連接移交給每個方法,從而爲我留下如下代碼:
@app.route("/login")
def foo():
if user_auth(g.db, request.form["name"], request.form["pw"]):
pass
,並在我的數據庫模塊
def user_auth(database, name, pw):
pass
我不認爲這是最好的辦法,但我有其他想法(如將g對象導入到我的數據庫類中)不起作用。我也不知道我的方法在併發db訪問方面是否安全,所以對此有任何幫助將不勝感激。
tl; dr如何以正確的方式拆分Flask-App和Database/Database-Utility?
我建議你看Flask-SQlAlchemy http://pythonhosted.org/Flask-SQLAlchemy/ – codegeek
爲什麼不直接在'user_auth'方法中訪問相同的'g.db',而不是傳入?由於它是一個本地線程,所有內容*都應該*正常工作。 –
1.我目前正在研究Flask-SQLAlchemy。不知道該怎麼想它:) 2.我試圖通過從我的數據庫模塊導入「g」,但我又需要將我的auth-method導入到我的主模塊中,這是不可能因爲循環依賴 – MrTrustworthy