我目前正在尝试使用 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。
