2

現在、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 を正しい方法で分割する方法は?

4

1 に答える 1

0

誰かがこの質問に出くわした場合に備えて:
正しい答えは、質問で説明されているアプローチを気にせず、代わりに Flask-SQLAlchemy を使い始めることです。

于 2013-11-05T17:16:30.373 に答える