現在、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 接続が作成され、小規模なアプリケーションでは問題なく動作します。
しかし、より大きなプロジェクトでは、データベース コード (いくつかのユーティリティ メソッドを含む) とアプリ コードを別のモジュールに配置したいので、(たとえば) 次のように記述できます。
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 を正しい方法で分割する方法は?