web-dev-qa-db-ja.com

Flaskは、GunicornなどのWSGIサーバーで実行されている「アドレスはすでに使用されています」を発生させます

Gunicornでアプリを実行しようとしています。ただし、Gunicornの起動中にFlaskはOSError: [Errno 98] Address already in useを発生させ、その後Gunicornはシャットダウンします。Gunicornでアプリを提供するにはどうすればよいですか?

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'

app.run(debug=True)
gunicorn app:app
[2017-02-19 21:09:50 -0800] [21965] [INFO] Starting gunicorn 19.6.0
[2017-02-19 21:09:50 -0800] [21965] [INFO] Listening at: http://127.0.0.1:8000 (21965)
[2017-02-19 21:09:50 -0800] [21965] [INFO] Using worker: sync
[2017-02-19 21:09:50 -0800] [21968] [INFO] Booting worker with pid: 21968
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
[2017-02-19 21:09:50 -0800] [21969] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker
    worker.init_process()
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/gunicorn/util.py", line 357, in import_app
    __import__(module)
  File "/home/david/Projects/py36/app.py", line 4, in <module>
    app.run(debug=True)
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/flask/app.py", line 841, in run
    run_simple(Host, port, self, **options)
  File "/home/david/.virtualenvs/py36/lib/python3.6/site-packages/werkzeug/serving.py", line 691, in run_simple
    s.bind((hostname, port))
OSError: [Errno 98] Address already in use

[2017-02-19 21:09:50 -0800] [21968] [INFO] Worker exiting (pid: 21968)
[2017-02-19 21:09:50 -0800] [21965] [INFO] Shutting down: Master
[2017-02-19 21:09:50 -0800] [21965] [INFO] Reason: Worker failed to boot.

gunicornConnectionを使用中pythonフラスコ および エラー:[Errno 98]アドレスはすでに使用中 を試しましたが、取得できませんでした作業。

12
Steven

Gunicornを使用しているため、Flask開発サーバーを使用したくありません。ただし、無条件にapp.runを呼び出しています。Gunicornが起動し、アドレスをバインドしてから、 app.runを呼び出して独自のサーバーを起動しようとするアプリですが、アドレスはすでにGunicornによって使用されています。

app.runをガードブロックに移動します:

if __name__ == '__main__':
    app.run()

または、 docs で説明されているように、flaskコマンドを使用して開発サーバーを実行する必要があるため、完全に削除することをお勧めします。

18
davidism