公式の クイックスタート では、単一のモジュールを使用する場合は__name__
を使用することをお勧めします。
- ...(この例のように)単一のモジュールを使用している場合は、
__name__
を使用する必要があります。アプリケーションとして起動したか、モジュールとしてインポートしたかによって、名前が異なるためです('__main__'
と実際のインポート名)。 ...
ただし、それらの APIドキュメント では、アプリケーションがパッケージの場合、ハードコーディングが推奨されます。
したがって、そこに何を提供するかが重要です。単一のモジュールを使用している場合、
__name__
は常に正しい値です。ただし、パッケージを使用している場合は、通常、パッケージの名前をそこにハードコーディングすることをお勧めします。
パッケージの名前をハードコーディングした方がよい理由は理解できますが、単一のモジュールの名前をハードコーディングしないのはなぜですか?または、言い換えると、最初のパラメータとして__main__
を受け取ったときに、Flask
はどのような情報を取得できますか? Flaskでリソースを見つけるのが簡単になる方法がわかりません...
__name__
は、アプリが定義されている場所のインポート名を取得する便利な方法です。 Flaskは、インポート名を使用して、リソース、テンプレート、静的ファイル、インスタンスフォルダーなどを検索する場所を認識します。パッケージを使用する場合、__init__.py
でアプリを定義すると、 __name__
は、リソースがどこにあるかを基準にして「正しい」場所を指し示します。ただし、mypackage/app.py
などの他の場所で定義した場合、__name__
を使用するとFlask mypackage
ではなくmypackage.app
に関連するリソースを検索します。
__name__
の使用は「ハードコーディング」とは直交せず、パッケージの名前を使用するためのショートカットにすぎません。そして、名前shouldがベースパッケージであると言う理由もありません、それは完全にあなたのプロジェクト構造次第です。
リファレンス: https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask
flaskオブジェクトは、WSGIアプリケーションを実装し、中央オブジェクトとして機能します。これには、アプリケーションのモジュールまたはパッケージの名前が渡されます。作成されると、オブジェクトの中央レジストリとして機能します関数、URLルール、テンプレート構成などを表示します。
パッケージの名前は、パッケージパラメータが実際のpythonパッケージ(___init__.py
_ファイル内)または標準モジュール(.pyファイルのみ)。
通常、次のように、メインモジュールまたはパッケージの___init__.py
_ファイルにFlaskインスタンスを作成します。
_from flask import Flask
app = Flask(__name__)
_
最初のパラメーターのアイデアは、Flaskがアプリケーションに属するもののアイデアを与えることです。この名前は、ファイルシステム上のリソースを見つけるために使用され、デバッグ情報を改善するために拡張機能によって使用できます。より多くの。
したがって、そこに何を提供するかが重要です。単一のモジュールを使用している場合、___name__
_は常に正しい値です。ただし、パッケージを使用している場合は、通常、パッケージの名前をそこにハードコーディングすることをお勧めします。
たとえば、アプリケーションがyourapplication/app.pyで定義されている場合は、以下の2つのバージョンのいずれかで作成する必要があります。
_app = Flask('yourapplication')
app = Flask(__name__.split('.')[0])
_
何故ですか?リソースがどのように検索されるかにより、アプリケーションは___name__
_でも機能します。ただし、デバッグがさらに困難になります。特定の拡張機能は、アプリケーションのインポート名に基づいて仮定を行うことができます。たとえば、Flask-SQLAlchemy拡張機能は、デバッグモードでSQLクエリをトリガーしたアプリケーション内のコードを探します。インポート名が正しく設定されていない場合、そのデバッグ情報は失われます。 (たとえば、yourapplication.views.frontendではなく、yourapplication.appのSQLクエリのみを取得します)