Отладка приложения Flask, запущенного в Gunicorn - PullRequest
59 голосов
/ 21 января 2012

Я работал над новой платформой разработчика, используя nginx / gunicorn и Flask для моего приложения.

В порядке, все работает нормально - проблема с отладкой слоя Flask. Когда в моем коде есть ошибка, я просто получаю прямую ошибку 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'

Пример некоторого кода Flask, который borks- 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 ]

73 голосов
/ 19 декабря 2012

Принятие решения не работает для меня.

Gunicorn - это среда предварительного разветвления, и, очевидно, отладчик Flask не работает в среде разветвления .

Внимание

Даже если интерактивный отладчик не работает в разветвление среды (что делает практически невозможным использование на производственные серверы) [...]

Даже если вы установите app.debug = True, вы все равно получите пустую страницу с сообщением Внутренняя ошибка сервера , если вы запустите с gunicorn testserver:app. Лучшее, что вы можете сделать с gunicorn, это запустить его с gunicorn --debug testserver:app. Это дает вам трассировку в дополнение к сообщению Внутренняя ошибка сервера . Однако это та же самая текстовая трассировка, которую вы видите в терминале, а не в отладчике Flask.

При добавлении раздела if __name__ ... в testserver.py и запуске python testserver.py для запуска сервера в разработке вы получаете отладчик Flask. Другими словами, не используйте gunicorn в разработке, если вам нужен отладчик Flask.

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 относительно корня проекта со следующим содержимым (документы здесь )

FLASK_ENV=development
DEBUG=True

Кроме того, не забудьте изменить строку app.config['DEBUG']... в testserver.py на что-то, что не будет запускать Flask в режиме отладки в рабочем режиме.

app.config['DEBUG'] = os.environ.get('DEBUG', False)
45 голосов
/ 22 января 2012

Конфигурация Flask полностью отделена от конфигурации gunicorn. Следуя документации Flask по файлам конфигурации , хорошим решением было бы изменить мой источник на это:

app = Flask(__name__)
app.config.from_pyfile('config.py')

и в config.py:

DEBUG = True
23 голосов
/ 24 августа 2013

Для пользователей Heroku , существует более простое решение, чем создание сценария bin / web, как предложено Ником.

Вместо foreman start, просто используйте foreman run python app.py, если хотитеотладить ваше приложение в разработке.

0 голосов
/ 30 декабря 2017

У меня была похожая проблема, когда я запускал флягу под огнестрельным оружием. Я не видел в стеке следы стека (приходилось каждый раз просматривать журналы).Настройка 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 отключен, потому что интерактивная отладка не будет работать с разветвлением (gunicorn).

0 голосов
/ 23 января 2012

Попробуйте установить флаг отладки для команды запуска следующим образом:

gunicorn -c gunicorn.conf.py --debug testserver:app

и сохраните DEBUG = True в своем приложении Flask.Должна быть причина, по которой ваша опция отладки не применяется из файла конфигурации, но на данный момент вышеприведенное примечание должно помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...