56

私はフラスコを使用しており、次のことを試みています。

アプリを実行するための main.py ファイル、つまり python main.py を定義しました -

from flask import Flask
from view import tags

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

ビューという名前のパッケージを定義しました。このパッケージで、それぞれ独自のルートを持つさまざまなビュー モジュールを宣言します。view.tags.py -

from flask import Flask
app = Flask(__name__)

@app.route('/e')
def hello_world2():
    return 'Hello World!'

そのため、サーバーを実行するための main.py と、ルートを登録するためのパッケージのビュー クラスにグローバル アプリ オブジェクトが必要です。では、グローバル アプリ オブジェクトを作成し、それをすべてのクラス間で共有するにはどうすればよいでしょうか。

ありがとう、ムルタザ

4

6 に答える 6

94

フラスコから current_app をインポートできます。グローバル アプリケーション オブジェクトへの参照を格納します。

from flask import current_app as app

def home():
    return render_template('base.html', name=app.name)
于 2015-07-07T21:02:41.703 に答える
27

まず、Blueprints http://flask.pocoo.org/docs/blueprints/を見ることをお勧めします。これは、アプリを簡単に整理するのに役立ちます。

http://flask.pocoo.org/docs/api/#flask.current_app Flask.current_appも参照してください。これは、他のモジュールでアプリ インスタンスを取得する方法です。

このリンクは、フラスコアプリを整理して構築する方法にも役立ちます (確かに理想的ではありませんが、いくつかのアイデアを提供できます) - Large-app-how-to.md

楽しむ :)

于 2012-11-08T09:34:18.927 に答える
20

1 つの方法は、パッケージ全体を作成し、__init__.pyその下にすべてのグローバル変数を宣言するファイルを追加することです。たとえば、あなたの場合、次のようなものを作成できます。

myapplication/
    *        __init__.py
    *        myviews/
        *         __init__.py
        *         view.py
        *         tags.py

__init__.pyここで、ファイルに次のコードを追加します。

app = Flask(__name__)

パッケージ myapplication をインポートする限り、この app 変数をどこでも使用できるようになりました。

import myapplication.myviews.view
于 2012-11-08T15:13:55.213 に答える
13

他のファイルからインポートするだけです。おそらくこれを行う最善の方法は、アプリ オブジェクトを 1 つのファイルに入れ、他のすべてをそこからインポートすることです。

たとえば、main.py には次のものが残っている可能性があります。

from flask import Flask
from view import tags

app = Flask(__name__)

そして、他のファイルでは、次のことができます。

from .main import app

または、パッケージ外の場合は、完全な文字列を使用してください

from mypackagename.main import app

注意すべきことの 1 つは、循環インポートです。この問題を処理する最も簡単な方法は、最初にアプリを作成し、作成後にベース ファイルから必要なものをすべてインポートすることです。

たとえば、次のようになります。

from flask import Flask
app = Flask(__name__)

# do some stuff with app
from .views import view1, view2
from .server import run

上記のように、アプリを作成した後にインポートを配置する限り、循環インポートの問題は発生しないはずです。

于 2012-11-08T09:12:25.307 に答える
4

別のソース ファイルの「ヘルパー」python 関数でのフラスコからの current_app のインポートと使用に関して、これは現在のアプリ コンテキストが既に設定されている限り機能します (例: Web 要求を受信)。アプリケーションの初期化中 (app.run がまだ呼び出されていない)、app.logger がヘルパー関数で呼び出される場合があります。

修正する前に (以下を参照)、「RuntimeError: Working outside of application context」で区切られたスタック トレースを取得しました。

サンプル ソリューション:
main.py:

import helper
...
app = Flask(__name__.split('.')[0],
        template_folder="templates",
        static_folder="static")
... 
# Fix: Create an app context
with app.app_context():
    helper.dbopen(...)
...
app.run(...)

helper.py:

from flask import current_app as app
...
def dbopen():
    app.logger.info(...)
    ...
于 2016-08-17T19:37:07.830 に答える