大規模なアプリケーション
次のような単純なフラスコアプリケーション構造を想像してみてください。
/yourapplication
yourapplication.py
/static
style.css
/templates
layout.html
index.html
login.html
...
これは小さなアプリケーションには問題ありませんが、大きなアプリケーションにはモジュールの代わりにパッケージを使用することをお勧めします。 NS チュートリアルパッケージパターンを使用するように構成されています。を参照してください。 :gh: `サンプルコード ` 。
シンプルなパッケージ
これをより大きなフォルダに変換するには、既存のフォルダ内に新しいフォルダyourapplication
を作成し、その下にすべてを移動します。 次に、yourapplication.py
の名前を__init__.py
に変更します。 (最初にすべての.pyc
ファイルを削除してください。そうしないと、問題が発生する可能性が高くなります)
その後、次のような結果になるはずです。
/yourapplication
/yourapplication
__init__.py
/static
style.css
/templates
layout.html
index.html
login.html
...
しかし、今どのようにアプリケーションを実行していますか? ナイーブなpython yourapplication/__init__.py
は機能しません。 Pythonがパッケージ内のモジュールをスタートアップファイルにしたくないとだけ言っておきましょう。 しかし、それは大きな問題ではありません。次の内容のsetup.py
という名前の新しいファイルを内側のyourapplication
フォルダーの横に追加するだけです。
from setuptools import setup
setup(
name='yourapplication',
packages=['yourapplication'],
include_package_data=True,
install_requires=[
'flask',
],
)
アプリケーションを実行するには、アプリケーションインスタンスの場所をFlaskに指示する環境変数をエクスポートする必要があります。
export FLASK_APP=yourapplication
プロジェクトディレクトリの外にいる場合は、アプリケーションディレクトリへの正確なパスを指定してください。 同様に、次のような開発機能をオンにすることができます。
export FLASK_ENV=development
アプリケーションをインストールして実行するには、次のコマンドを発行する必要があります。
pip install -e .
flask run
これから何を得ましたか? これで、アプリケーションを少し再構築して複数のモジュールにすることができます。 覚えておく必要があるのは、次の簡単なチェックリストだけです。
- Flask アプリケーションオブジェクトの作成は、
__init__.py
ファイルに含まれている必要があります。 そうすれば、各モジュールはそれを安全にインポートでき、 __ name __ 変数は正しいパッケージに解決されます。 - すべてのビュー関数(
route()
デコレータが上にある関数)は、__init__.py
ファイルにインポートする必要があります。 オブジェクト自体ではなく、オブジェクトが含まれているモジュールです。 アプリケーションオブジェクトの作成後にビューモジュールをインポートします。
次に例を示します__init__.py
:
from flask import Flask
app = Flask(__name__)
import yourapplication.views
そして、これはviews.py
がどのように見えるかです:
from yourapplication import app
@app.route('/')
def index():
return 'Hello World!'
その後、次のような結果になるはずです。
/yourapplication
setup.py
/yourapplication
__init__.py
views.py
/static
style.css
/templates
layout.html
index.html
login.html
...
循環輸入
すべてのPythonプログラマーはそれらを嫌っていますが、それでもいくつか追加しました:循環インポート(2つのモジュールが相互に依存している場合です。 この場合、views.py
は__init__.py
に依存します。 これは一般的に悪い考えですが、ここでは実際には問題ないことに注意してください。 これは、__init__.py
のビューを実際に使用しておらず、モジュールがインポートされていることを確認するだけで、ファイルの最後でそれを行っているためです。
そのアプローチにはまだいくつかの問題がありますが、デコレータを使用したい場合はそれを回避する方法はありません。 これに対処するためのインスピレーションについては、 Becoming Big セクションを確認してください。
ブループリントの操作
大規模なアプリケーションがある場合は、それらを小さなグループに分割し、各グループがブループリントを使用して実装されるようにすることをお勧めします。 このトピックの簡単な紹介については、ドキュメントのブループリント付きモジュラーアプリケーションの章を参照してください。