Отладка приложения 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 53

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).