アプリの呼び出し可能オブジェクト、WSGI サーバー、Flask の循環インポートに関する質問
私は(おそらく)混乱しています。app-factories から Flask / WSGI アプリを安全に作成し、WSGI サーバーで簡単に使用できるようにしたいと考えています。
tl;dr
initのインポート時にアプリを作成するのを安全に回避し(推奨)、後で作成することはできますか (つまり、ファクトリ メソッドを使用)
そのアプリを WSGI サーバーでうまく動作させるにはどうすればよいですか? 特に、構成やその他の設定をENVから取得していないときに渡します
例えば::
def make_app(configdict, appname):
app = Flask(appname)
app.config.update(configdict)
init_db(configdict)
set_app_in_global_namespace(app)
#importing now will allow from pkg import app
from mypackage import views
return app
上記の「ファクトリー」を使用したいのは、テストなどの構成を簡単に制御したいからです。
次に、アプリケーションを WSGI サーバーに提供する wsgi.py モジュールを作成したいと考えています。
したがって、最終的には次のようになります
初期化.py::
app = None
def make_app(configdict, appname):
flaskapp = Flask(appname)
flaskapp.config.update(configdict)
init_db(configdict)
global app
app = flaskapp
#importing now will allow from pkg import app
from mypackage import views
return flaskapp
wsgi.py::
from mypackage import app
app = make_app(configfromsomewhere, "myname")
uWSGI::
uwsgi --module=mypackage.wsgi:app
しかし、それでも wsgi.py は wsgi.py --settings=x --host=10.0.0.1 のように呼び出すことができるものではないため、構成を に渡す方法がよくわかりません。
私が尋ねているのは、これは... OK...と思われる一方で、少し厄介でもあるからです。
すべてがENVにあったとき、生活は楽になりました。
だけでなく、次のこともできます。
では、app-factory を使用する上で危険なことは何ですか?
here <http://flask.pocoo.org/docs/patterns/packages>
_ に与えられたアドバイスは::
1. the Flask application object creation has to be in the
__init__.py file. That way each module can import it safely and
the __name__ variable will resolve to the correct package.
2. all the view functions (the ones with a route() decorator on
top) have to be imported in the __init__.py file. Not the object
itself, but the module it is in. Import the view module after
the application object is created.
re: 2.、明らかに、ルート デコレータはインスタンス化されたアプリから特定の機能を期待しており、それらなしでは機能しません。それはいいです。
re: 1.、OK、正しい名前が必要です。しかし、何が安全ではないのでしょうか? なぜ?初期化されていない場合、アプリをインポートして使用するのは安全ではありませんか? 壊れますが、危険ではありません。それは非常に自慢のスレッドローカルですか?おそらく。しかし、ランダムなモジュールから無作為にアプリのインスタンスを抜き取っている場合、問題が発生することが予想されます。
含意 - ビュー以外からアプリ オブジェクトを参照することはありません - 基本的に、モジュール化を適切かつ緊密に保ち、辞書、エラー オブジェクト、さらには WebObs を渡します。
http://flask.pocoo.org/docs/patterns/appdispatch http://flask.pocoo.org/docs/deploying/#deployment http://flask.pocoo.org/docs/patterns/packages/#larger-アプリケーション http://flask.pocoo.org/docs/becomingbig