1

では、 http://pythonhosted.org/Flask-SQLAlchemy/api.htmlflask-sqlalchemyの構築の 2 番目のアプローチが同様に提案されない理由を知っている人はいますか? 1 番目と 2 番目の構築方法の主な違いは、単純に 1 番目の構築方法と 2 番目の構築方法の違いです。db.app = appdb.app = appdb.app = None

ありがとう!

4

1 に答える 1

3

初期化の 2 つの方法は、Flask 拡張機能のかなり標準的なものであり、拡張機能の初期化方法に関する暗黙の規則に従います。Flask ドキュメントのこのセクションでは、それを説明するメモを見つけることができます。

お気づきのとおり、init_app は app を self に割り当てません。これは意図的なものです!クラス ベースの Flask 拡張機能は、アプリケーションがコンストラクターに渡されたときにのみ、アプリケーションをオブジェクトに格納する必要があります。これは拡張機能に次のように伝えます。複数のアプリケーションを使用することに興味はありません。

拡張機能が現在のアプリケーションを見つける必要があり、そのアプリケーションへの参照がない場合、ローカルの current_app コンテキストを使用するか、アプリケーションを明示的に渡すことができるように API を変更する必要があります。

この考え方は次のように要約できます。

  • コンストラクターを使用するSQLAlchemy(app)と、拡張機能はそれが唯一のアプリケーションであると想定するappため、それへの参照を に格納しself.appます。
  • コンストラクターを使用すると、拡張機能はそれがおそらく多くのアプリケーションの 1 つであるinit_app(app)ことを前提とします。appそのため、参照を保存する代わりにcurrent_app、アプリケーションが必要になるたびにアプリケーションを見つけることに依存します。

拡張機能を初期化する 2 つの方法の実質的な違いは、最初の形式では、コンストラクターでアプリケーションを渡す必要があるため、アプリケーションが存在している必要があることです。2 番目の形式ではdb、コンストラクターに何も渡さないため、アプリケーションが存在する前にオブジェクトを作成できます。この場合db.init_app(app)、アプリケーション インスタンスが作成されるまで呼び出しを延期します。アプリケーション インスタンスの作成が遅れる典型的な状況は、アプリケーション ファクトリ パターンを使用する場合です。

于 2013-11-03T06:41:30.373 に答える