【发布时间】:2013-11-04 15:00:40
【问题描述】:
我目前正在尝试使用 python、flask 和 sqlite 编写一个小型 Web 应用程序,但我不确定如何处理数据库连接。
基本上我一直在关注“官方”教程(和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")
因此,这将为我的应用程序可以用来执行 sql 命令的每个请求创建一个 DB-Connection,它适用于较小的应用程序。
但是对于一个更大的项目,我想把我的数据库代码(带有一些实用方法)和应用程序代码放在不同的模块中,所以我可以(例如)写:
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-connection 移交给每个方法,留下我用这样的代码:
@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 pythonhosted.org/Flask-SQLAlchemy
-
为什么不简单地在您的
user_auth方法中访问相同的g.db,而不是将其传入?因为它是一个本地线程,所以一切应该正常工作。 -
1.我目前正在研究 Flask-SQLAlchemy。还不知道该怎么想 :) 2. 我通过从我的数据库模块中导入“g”来尝试过,但是我需要再次将我的身份验证方法导入到我的主模块中,这不是可能是因为循环依赖
-
你真的应该听从建议并使用 Flask-SQLAlchemy。
-
我一直在使用 Flask-SQLAlchemy 重建应用程序。虽然我花了一些时间来启动和运行它(我想我需要更长的时间才能正确地获得一些 N:M-Mapping),但我不得不说到目前为止它的可用性给我留下了深刻的印象,绝对值得我说的努力。谢谢大家的帮助:)