gunicorn + flask (connexion / swagger_server) тайм-аут / не отвечает на запросы API - PullRequest
0 голосов
/ 17 февраля 2020

swagger_server connexion / flask работает нормально, когда я это делаю:

python3 -m swagger_server

Он работает на порте 8080.

Когда я пытаюсь поставить его на gunicorn (ссылка: как использовать gunicorn с swagger_server на flask), gunicorn работает нормально, но запросы на порт 8080 не выполняются.

Во-первых, когда я использую тот же порт 8080, он жалуется на связывание / уже используется (я полагаю, ожидается, поскольку они оба на порте 8080):

gunicorn "swagger_server.__main__:main" -b 0.0.0.0:8080 -w 4
...
OSError: [Errno 48] Address already in use

Но например, при переходе на порт 4000 истекает время ожидания запросов:

gunicorn "swagger_server.__main__:main" -b 0.0.0.0:4000 -w 4
...
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
[2020-02-16 17:21:18 -0500] [34798] [CRITICAL] WORKER TIMEOUT (pid:34802)

Когда я включаю отладку, я вижу, что она пытается подключиться к порту 4000 вместо 8080.

[2020-02-16 17:28:13 -0500] [34866] [INFO] Starting gunicorn 20.0.4
[2020-02-16 17:28:13 -0500] [34866] [ERROR] Connection in use: ('0.0.0.0', 4000)
[2020-02-16 17:28:13 -0500] [34866] [ERROR] Retrying in 1 second.
[2020-02-16 17:28:14 -0500] [34866] [ERROR] Connection in use: ('0.0.0.0', 4000)
...

Вот мой main.py

def main(arg1, arg2):
    app = connexion.App(__name__, specification_dir='./swagger_server/', debug=False)
    app.app.json_encoder = encoder.JSONEncoder
    app.add_api('api-v2.yaml', arguments={'title': 'API'})
    app.run(host='0.0.0.0', port=8080)


if __name__ == '__main__':
    main(None, None)

Пожалуйста, сообщите, что мне здесь не хватает. Спасибо.

1 Ответ

0 голосов
/ 20 февраля 2020

Swagger генерирует __main__.py неверным образом, вам нужно создать базу модификаций на нем.

#!/usr/bin/env python3

import connexion

from swagger_server import encoder

app = connexion.App(__name__, specification_dir='./swagger/')
app.app.json_encoder = encoder.JSONEncoder
app.add_api('swagger.yaml', arguments={'title': 'My API'}, pythonic_params=True)

Затем попробуйте снова

gunicorn swagger_server.__main__:app 

Gunicorn оборачивает запрос netowrk в WSGI и вперед flask (werkzeug) переменная app в __main__.py является точкой входа WSGI werkzeug.

...