2

私は中型フラスコのアプリケーションに取り組んでいます。私は 2 つのメイン モジュールを持っています。1 つは schema.py と呼ばないようにデータベースを作成するモジュールで、もう 1 つはビューを提供するモジュールである views.py です。http://flask.pocoo.org/docs/patterns/packages/で提案されている構造を使用しています。 と の両方appを 定義db=SQLAlchemy(app)してい__init__.pyます。ここで循環インポートの問題に取り組みます! 以下は私のファイルのインポートです:

schema.py:

from myapp import db

views.py:

from myapp import app,db
import myapp.schema

__init__.py

import myapp.views

そのため、schema.py を実行すると、循環インポート エラーが発生します。これをどのように解決すればよいですか?提案をいただければ幸いです。

4

3 に答える 3

3

そうそう、循環インポートにも何度も遭遇しましたが、それを解決する方法は、ドキュメントにあるアプリケーション ファクトリを作成することです。

http://flask.pocoo.org/docs/patterns/appfactories/

また、コンポーネントを入力するための別のモジュールまたは別の場所を作成することも検討してください。良い例は、例として SQLAlchemy を使用した次のようになります。

#: SQLalchemy object created without an attached app
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    #: some configuration stuff

    #: Initializing app.
    db.init_app(app)

    return app

必要に応じて、コンポーネントを別のモジュールに配置して、それらをより分離したままにすることもできますが、これは、循環インポートを防ぐために私たちが見つけた最も簡単な方法です。

于 2013-02-13T21:29:35.997 に答える
1

http://flask.pocoo.org/docs/patterns/packages/から: (強調表示を追加)

すべての Python プログラマーはそれらを嫌っていますが、いくつか追加しました: 循環インポート (これは、2 つのモジュールが互いに依存している場合です。この場合、views.py は に依存しています__init__.py)。これは一般的には悪い考えですが、ここでは実際には問題ありません。この理由は、実際にはビューを使用しておらず__init__.py、モジュールがインポートされていることを確認しているだけであり、ファイルの下部でそれを行っているためです。

import myapp.viewsが の一番下にあり__init__.py、 の後appdbが定義されていることを確認してください。これはpep8 ガイドラインに反しますが、上記の引用が示すように、ここでは実際に問題ありません。

于 2013-01-28T19:56:31.117 に答える
1

フラスコには というオブジェクトgがあり、 というものもありcurrent_appます。current_app簡単な言葉で言えば、 init または任意のファイル (アプリを初期化するファイル) で作成したアプリであり、後でアプリを表し、インポートした場合に遊ぶことができますfrom flask import current_app。もちろん、いくつかの制限がありますが、たとえば、アプリの設定にアクセスする必要がある場合、これは確かに役立ちます.

についてg- これは、DB 接続などを保持し、アプリのあらゆる場所に配置するのに非常に適した場所です。あなたの__init__.py意志に次のようなものがある場合:

from flask import g
g.db = connect_to_some_db(...)

次に、db接続を使用する必要がある他の場所で-簡単です:

from flask import g
# do something with your db
g.db.some_method_or_whatever(...)
于 2013-01-27T06:58:57.840 に答える