web-dev-qa-db-ja.com

Flask( 'application')とFlask(__ name__)

公式の クイックスタート では、単一のモジュールを使用する場合は__name__を使用することをお勧めします。

  1. ...(この例のように)単一のモジュールを使用している場合は、__name__を使用する必要があります。アプリケーションとして起動したか、モジュールとしてインポートしたかによって、名前が異なるためです('__main__'と実際のインポート名)。 ...

ただし、それらの APIドキュメント では、アプリケーションがパッケージの場合、ハードコーディングが推奨されます。

したがって、そこに何を提供するかが重要です。単一のモジュールを使用している場合、__name__は常に正しい値です。ただし、パッケージを使用している場合は、通常、パッケージの名前をそこにハードコーディングすることをお勧めします。

パッケージの名前をハードコーディングした方がよい理由は理解できますが、単一のモジュールの名前をハードコーディングしないのはなぜですか?または、言い換えると、最初のパラメータとして__main__を受け取ったときに、Flaskはどのような情報を取得できますか? Flaskでリソースを見つけるのが簡単になる方法がわかりません...

14
nalzok

__name__は、アプリが定義されている場所のインポート名を取得する便利な方法です。 Flaskは、インポート名を使用して、リソース、テンプレート、静的ファイル、インスタンスフォルダーなどを検索する場所を認識します。パッケージを使用する場合、__init__.pyでアプリを定義すると、 __name__は、リソースがどこにあるかを基準にして「正しい」場所を指し示します。ただし、mypackage/app.pyなどの他の場所で定義した場合、__name__を使用するとFlask mypackageではなくmypackage.appに関連するリソースを検索します。

__name__の使用は「ハードコーディング」とは直交せず、パッケージの名前を使用するためのショートカットにすぎません。そして、名前shouldがベースパッケージであると言う理由もありません、それは完全にあなたのプロジェクト構造次第です。

18
davidism

リファレンス: 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クエリのみを取得します)

0
variable