Отладка приложения Flask, работающего в Gunicorn
Я работаю над новой платформой dev, используя nginx/gunicorn и колбу для моего приложения.
Ops-wise, все работает нормально-проблема, которую я имею, заключается в отладке слоя колбы. Когда в моем коде есть ошибка, Я просто получаю прямую ошибку 500, возвращенную в браузер, и ничего не появляется на консоли или в моих журналах.
Я пробовал много разных конфигов/настроек.. Наверное, я должны не хватает чего-то очевидного.
мой gunicorn.conf:
import os
bind = '127.0.0.1:8002'
workers = 3
backlog = 2048
worker_class = "sync"
debug = True
proc_name = 'gunicorn.proc'
pidfile = '/tmp/gunicorn.pid'
logfile = '/var/log/gunicorn/debug.log'
loglevel = 'debug'
пример некоторого кода колбы, который боркс - testserver.py:
from flask import Flask
from flask import render_template_string
from werkzeug.contrib.fixers import ProxyFix
app = Flask(__name__)
@app.route('/')
def index():
n = 1/0
return "DIV/0 worked!"
и, наконец, команда для запуска приложения колбы в gunicorn:
gunicorn -c gunicorn.conf.py testserver:app
спасибо вам
5 ответов
принятие решение не работает для меня.
Gunicorn является предварительно раздвоение окружающей среды и, по-видимому отладчик колбы не работает в среде разветвления.
внимание
даже если интерактивный отладчик не работает в среды разветвления (что делает практически невозможным использование на производственный сервер.[ )..]
, даже если app.debug = True
, вы все равно получите только пустая страница с сообщением Внутренняя Ошибка Сервера если вы работаете с gunicorn testserver:app
. Лучшее, что вы можете сделать с gunicorn, это запустить его с gunicorn --debug testserver:app
. Это дает вам трассировку в дополнение к Внутренняя Ошибка Сервера сообщение. Однако это та же самая текстовая трассировка, которую вы видите в терминале, а не отладчик колбы.
добавлять if __name__ ...
раздел к testserver.py и бегом!--9--> чтобы запустить сервер в разработке, вы получаете колбу отладчик. другими словами, Не используйте gunicorn в разработке, если вы хотите отладчик колбы.
app = Flask(__name__)
app.config['DEBUG'] = True
if __name__ == '__main__':
app.run()
совет для пользователей Heroku:
лично мне все еще нравится использовать foreman start
, вместо python testserver.py
С он устанавливает все переменные env для меня. Чтобы заставить это работать:
содержание Procfile
web: bin/web
содержание bin/web
, файл относительно проекта root
#!/bin/sh
if [ "$FLASK_ENV" == "development" ]; then
python app.py
else
gunicorn app:app -w 3
fi
В разработка, создание .env
файл относительно корня проекта со следующим содержимым (docs здесь)
FLASK_ENV=development
DEBUG=True
кроме того, не забудьте изменить app.config['DEBUG']...
в строке testserver.py
к чему-то, что не будет запускать колбу в режиме отладки в производстве.
app.config['DEBUG'] = os.environ.get('DEBUG', False)
конфигурация колбы полностью отделена от конфигурации gunicorn. Вслед за документация колбы по конфигурационным файлам, хорошим решением было бы изменить мой источник на это:
app = Flask(__name__)
app.config.from_pyfile('config.py')
и в config.py:
DEBUG = True
для пользователей Heroku, есть более простое решение, чем создание сценария bin/web, как предложил Ник.
вместо foreman start
, просто использовать foreman run python app.py
Если вы хотите отладить приложение в разработке.
попробуйте установить флаг отладки в команде run, например
gunicorn -c gunicorn.conf.py --debug testserver:app
и сохранить DEBUG = True
в приложении Flask. Должна быть причина, по которой ваш параметр debug не применяется из файла config, но на данный момент вышеуказанное Примечание должно заставить вас идти.
У меня была аналогичная проблема при запуске колбы под gunicorn я не видел stacktraces в браузере (приходилось каждый раз смотреть журналы). Настройка DEBUG, FLASK_DEBUG или что-либо, упомянутое на этой странице, не работает. Наконец я сделал следующее:--2-->
app = Flask(__name__)
app.config.from_object(settings_map[environment])
if environment == 'development':
from werkzeug.debug import DebuggedApplication
app_runtime = DebuggedApplication(app, evalex=False)
else:
app_runtime = app
Примечание evalex отключен, потому что интерактивный debbugging не будет работать с раздвоением (gunicorn).