2013-11-04 34 views
2

我目前正在嘗試使用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?

+4

我建議你看Flask-SQlAlchemy http://pythonhosted.org/Flask-SQLAlchemy/ – codegeek

+1

爲什麼不直接在'user_auth'方法中訪問相同的'g.db',而不是傳入?由於它是一個本地線程,所有內容*都應該*正常工作。 –

+0

1.我目前正在研究Flask-SQLAlchemy。不知道該怎麼想它:) 2.我試圖通過從我的數據庫模塊導入「g」,但我又需要將我的auth-method導入到我的主模塊中,這是不可能因爲循環依賴 – MrTrustworthy

回答

1

以防萬一有人在這個問題上絆倒:
正確的答案是不打擾在問題中描述的方法,而是開始使用Flask-SQLAlchemy工作。

相關問題