Отладка приложения Flask, запущенного в Gunicorn
Я работаю над новой платформой для разработчиков, используя nginx/gunicorn и Flask для моего приложения.
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!"
и, наконец, команда для запуска приложения flask в 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 и бежитpython testserver.py
для запуска сервера в разработке вам достанется колба отладчик. другими словами, Не используйте 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
, файл относительно проекта корень#!/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. Following колба документация по конфигурационным файлам, хорошим решением было бы изменить мой источник на это:
app = Flask(__name__) app.config.from_pyfile('config.py')
и в config.py:
DEBUG = True
для пользователей Heroku есть более простое решение, чем создание ящика/веб-скрипт, как предложил Ник.
вместо
foreman start
, просто использоватьforeman run python app.py
Если вы хотите отладить приложение в разработке.
попробуйте установить флаг отладки в команде run так
gunicorn -c gunicorn.conf.py --debug testserver:app
и сохранить
DEBUG = True
в приложения колбу. Должна быть причина, по которой ваш параметр отладки не применяется из файла конфигурации, но на данный момент вышеприведенное Примечание должно заставить вас идти.
У меня была аналогичная проблема при запуске колбы под gunicorn я не видел stacktraces в браузере (приходилось смотреть на журналы каждый раз). Настройка DEBUG, FLASK_DEBUG или что-либо упомянутое на этой странице не сработало. Наконец я сделал это:
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).