web-dev-qa-db-ja.com

Gunicornは、名前が「アプリケーション」から変更されたときにアプリを見つけることができません

私が使う gunicorn --workers 3 wsgiを実行してFlask app。変数applicationmyappに変更すると、GunicornはエラーAppImportError: Failed to find application: 'wsgi'。このエラーが発生する理由と修正方法を教えてください。

myproject.py

from flask import Flask

myapp = Flask(__name__)

@myapp.route("/")
def hello():
    return 'Test!'

if __name__ == "__main__":
    myapp.run(Host='0.0.0.0')

wsgi.py

from myproject import myapp

if __name__ == "__main__":
    myapp.run()
31
xiº

Gunicorn(およびほとんどのWSGIサーバー)は、デフォルトで、applicationまたはappという名前の呼び出し可能オブジェクトを、指​​定したモジュールで探します。エイリアスを追加するfrom myproject import myapp as applicationまたはapplication = myappはGunicornにcallableを再び発見させます。

しかし wsgi.pyファイルまたはエイリアスは必要ありません。Gunicornは実際のモジュールと呼び出し可能オブジェクトを直接指すことができ、引数を使用してアプリファクトリを呼び出すこともできます。別 wsgi.pyファイルはほとんどの場合必要ありません。

gunicorn myproject:myapp --workers 16
# equivalent to "from myproject import myapp as application"

gunicorn 'myproject.app:create_app("production")' --workers 16
# equivalent to:
# from myproject.app import create_app
# application = create_app("production")

Gunicornは、その前のパスから「:」に続く名前をインポートします。括弧がある場合、名前を引数で呼び出してアプリケーションを取得します。そうでない場合、名前はアプリケーションであると想定されます。

63
davidism

server/app.py内でappという名前のアプリを提供しようとしている場合、次のようにポート8000​​でサーバーを起動できます。

gunicorn server.app:app -b 0.0.0.0:8000
14
duhaime