では、 http://pythonhosted.org/Flask-SQLAlchemy/api.htmlflask-sqlalchemy
の構築の 2 番目のアプローチが同様に提案されない理由を知っている人はいますか? 1 番目と 2 番目の構築方法の主な違いは、単純に 1 番目の構築方法と 2 番目の構築方法の違いです。db.app = app
db.app = app
db.app = None
ありがとう!
では、 http://pythonhosted.org/Flask-SQLAlchemy/api.htmlflask-sqlalchemy
の構築の 2 番目のアプローチが同様に提案されない理由を知っている人はいますか? 1 番目と 2 番目の構築方法の主な違いは、単純に 1 番目の構築方法と 2 番目の構築方法の違いです。db.app = app
db.app = app
db.app = None
ありがとう!
初期化の 2 つの方法は、Flask 拡張機能のかなり標準的なものであり、拡張機能の初期化方法に関する暗黙の規則に従います。Flask ドキュメントのこのセクションでは、それを説明するメモを見つけることができます。
お気づきのとおり、init_app は app を self に割り当てません。これは意図的なものです!クラス ベースの Flask 拡張機能は、アプリケーションがコンストラクターに渡されたときにのみ、アプリケーションをオブジェクトに格納する必要があります。これは拡張機能に次のように伝えます。複数のアプリケーションを使用することに興味はありません。
拡張機能が現在のアプリケーションを見つける必要があり、そのアプリケーションへの参照がない場合、ローカルの current_app コンテキストを使用するか、アプリケーションを明示的に渡すことができるように API を変更する必要があります。
この考え方は次のように要約できます。
SQLAlchemy(app)
と、拡張機能はそれが唯一のアプリケーションであると想定するapp
ため、それへの参照を に格納しself.app
ます。init_app(app)
ことを前提とします。app
そのため、参照を保存する代わりにcurrent_app
、アプリケーションが必要になるたびにアプリケーションを見つけることに依存します。拡張機能を初期化する 2 つの方法の実質的な違いは、最初の形式では、コンストラクターでアプリケーションを渡す必要があるため、アプリケーションが存在している必要があることです。2 番目の形式ではdb
、コンストラクターに何も渡さないため、アプリケーションが存在する前にオブジェクトを作成できます。この場合db.init_app(app)
、アプリケーション インスタンスが作成されるまで呼び出しを延期します。アプリケーション インスタンスの作成が遅れる典型的な状況は、アプリケーション ファクトリ パターンを使用する場合です。