Как отлаживать приложение Django, работающее на Heroku, используя удаленное соединение pdb?
Чтобы отладить ошибку, которую я вижу на Heroku, но не на моей локальной машине, я пытаюсь выполнить сквозную отладку.
Типичный подход import pdb; pdb.set_trace()
не работает с Heroku, поскольку у вас нет доступа к консоли, подключенной к вашему приложению, но, видимо, вы можете использовать rpdb, a "remote" версия pdb.
Итак, я установил rpdb, добавил import rpdb; rpdb.set_trace()
в соответствующее место. Когда я делаю запрос, который попадает на строку rpdb, приложение зависает, как ожидалось, и я вижу следующее в моем журнале heroku:
pdb is running on 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc:4444
Итак, как подключиться к pdb, который работает? Я пробовал heroku run nc 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc 4444
, чтобы попытаться подключиться к именованному узлу из системы heroku, но сразу же выходит из состояния 1 и не появляется сообщение об ошибке.
Итак, мой конкретный вопрос: как мне теперь подключиться к этому удаленному pdb?
Общий связанный вопрос: это даже правильный способ для такой интерактивной отладки приложения, работающего на Heroku? Есть ли способ лучше?
ПРИМЕЧАНИЕ RE CELERY: Заметьте, я также попробовал аналогичный подход с Celery, но безуспешно. Используемый по умолчанию массив сельдерей rdb (удаленная оболочка pdb) использует localhost
, к которому вы не можете добраться, когда это Heroku. Я попытался использовать переменную среды CELERY_RDB_HOST
в домене веб-сайта, размещенного на Heroku, но это дает ошибку "Невозможно присвоить запрошенный адрес". Итак, это та же самая основная проблема - как подключиться к удаленному экземпляру pdb, который работает на Heroku?
Ответы
Ответ 1
В ответ на ваш второй вопрос я делаю это по-разному в зависимости от типа ошибки (браузер, сторона или вид). Для тестирования бэкэнда и просмотра (unittests) вам понравится эта работа?
$ heroku run --app=your-app "python manage.py shell --settings=settings.production"
Затем отладка в ipython:
>>> %run -d script_to_run_unittests.py
Даже если вы не используете приложение django, вы можете просто запустить отладчик в качестве параметра командной строки для ipython, чтобы любые ошибки python отбросили вас в отладчик:
$ heroku run --app=your-app "ipython --pdb"
Передние испытания - это совершенно другая игра с мячом, где вы должны смотреть на инструменты, такие как селен. Я думаю, что там также есть модуль набора салатов, который упрощает запись тестов на лицевой панели. Написание теста, который ломается, является первым шагом в отладке (или так мне говорят;).
Если ошибка выглядит просто, вы всегда можете выполнить старую "печать и запуск" с чем-то вроде
import logging
logger = logging.getLogger(__file__)
logger.warn('here be bugs')`
и просмотрите свои файлы журналов с помощью getentry.com или эквивалентного средства мониторинга или просто:
heroku logs --tail
Ответ 2
Я думаю, вы ищете что-то вроде этого:
http://docs.celeryproject.org/en/latest/tutorials/debugging.html