Skip to main content
 首页 » 编程设计

python之如何在较大的 Python/Flask 应用程序中组织数据库连接

2025年05月04日10freeliver54

我目前正在尝试使用 python、flask 和 sqlite 编写一个小的网络应用程序,但我不确定如何处理数据库连接。

基本上我一直在遵循“官方”教程(和 http://flask.pocoo.org/docs/patterns/sqlite3/#sqlite3 ),在我的主 Flask/App 模块中留下这样的代码(大幅缩短):

@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") 

因此,这会为每个请求创建一个 DB-Connection,我的应用程序可以使用它来执行 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),而我能让它工作的唯一方法是“手动”将数据库连接移交给每个方法,让我使用这样的代码:

@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 对象导入我的数据库类)不起作用。我也不知道我的方法对于并发数据库访问是否安全,因此我们将不胜感激。
tl;dr 如何以正确的方式拆分 Flask-App 和 Database/Database-Utility?

请您参考如下方法:

以防万一有人偶然发现这个问题:
正确的答案是不要理会问题中描述的方法,而是开始使用 Flask-SQLAlchemy。