Pull to refresh

Отладка в Django

Reading time4 min
Views28K
Новичкам в Django будет полезно узнать об очень полезном инструменте отладки — debug-toolbar. Он настолько крут, что его называют Firebug for Django. На больших проектах без него (или другого отладчика) не обойтись.

Debug-toolbar — это набор панелей, появляющихся на странице в режиме отладки.

Google Development
Набор панелей можно менять. На данный момент доступны 9 штук. Вот некоторые подробности:


Version


Показывает версию Django. Эту панель я обычно отключаю, т. к. версию знаю и без подсказок, а места на экране и так мало.


Timer


Время выполнения приложения и число переключений контекста.

Timer
Очень вредная вкладка. Если держать эти цифры всегда перед глазами, проект не получиться сдать в срок — всегда будет казаться, что все операции выполняются как минимум в 10 раз дольше, чем могли бы.

Помните: «Преждевременная оптимизация — корень всех зол».


SettingsVars


Тут можно увидеть все настройки Django из файла settings.py данного приложения. Не знаю, есть ли в этом большая пользя — конфиг всегда можно и в файле посмотреть.


Headers


Теоретически, тут должны быть заголовки HTTP-запроса, который привел к отображению исследуемой страницы. Но на самом деле на этой панели я вижу список серверных переменных окружения:

HTTP Headers
Нужны не часто, но хорошо, когда такая информацию есть под рукой.


Request


Тут можно посмотреть cookies для этого домена, Django session variables, а также переменные, переданные в GET/POST-запросе. Вы сможете это себе представить и без картинки.


Template


Панель информации о шаблоне, с помощью которого происходит вывод. Наверное, хорошо работает при использовании родного шаблонизатора Django. А для посторонних работает только просмотр контекстов:

HTTP Headers


SQLDebug


Мощная штука. Показывает все запросы к БД, время их выполнения и полную трассировку.

SQL Debug

Это позволяет выявить проблемный по производительности запрос и легко найти его даже в самом запутанном приложении с наследованием шаблонов. Работает для любого шаблонизатора, вроде бы.

Кстати, любой запрос можно выполнить прямо из панели, а также попросить его Explain или даже Profile (если БД поддерживает).

SQL Debug


Cache


Панель позволяет просматривать акты записи и чтения из кеша, полученную информацию, потраченное время и другую статистику кеширования:

Cache
Например, на этой картинке видно, что была попытка взять ключ update_sites из кеша, но он оказался пустым (кеш был просроченным). Затем случилась запись в кеш новых данных. Хочется верить, что в колонке Time верный порядок цифр и размерность.


Logging


Это как console.log('Привет'). Выводит отладочные сообщения Python-модуля logging. Чтобы получить отладочный вывод, нужно подключить модуль и что-то в него сказать:

    import logging<br>    logging.info('Пороки этого мира суть метафоры добродетелей мира грядущего.')<br>
Logging
Жаль, что разные уровни сообщений не выделяются цветом.


Как установить

  1. скачать что-нибудь с официального сайта
  2. разархивировать это и запустить python setup.py install
  3. добавить 'debug_toolbar.middleware.DebugToolbarMiddleware' последней записью в MIDDLEWARE_CLASSES
  4. добавить 'debug_toolbar ' в INSTALLED_APPS
  5. правильно настроить INTERNAL_IPS — перечислить там ip адреса разработчиков, которым можно показывать Debug
  6. еще можно настроить некоторые опции DEBUG_TOOLBAR

Лично я подключаю debug_toolbar только в режиме отладки:

if DEBUG:<br>    MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',)<br>    INSTALLED_APPS += ('debug_toolbar',)<br>    DEBUG_TOOLBAR_PANELS = (<br>        #'debug_toolbar.panels.version.VersionDebugPanel', # убрать. только место занимает.<br>        'debug_toolbar.panels.timer.TimerDebugPanel',<br>        'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',<br>        'debug_toolbar.panels.headers.HeaderDebugPanel',<br>        'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',<br>        'debug_toolbar.panels.template.TemplateDebugPanel',<br>        'debug_toolbar.panels.sql.SQLDebugPanel',<br>        'debug_toolbar.panels.cache.CacheDebugPanel',<br>        'debug_toolbar.panels.logger.LoggingPanel',<br>    )<br>    DEBUG_TOOLBAR_CONFIG = {<br>        'EXCLUDE_URLS': ('/admin',), # не работает, но в разработке есть...<br>        'INTERCEPT_REDIRECTS': False,<br>    }

«INTERCEPT_REDIRECTS = False» отключает перехват перенаправлений. Если не отключать, то сначала произойдет перенаправление на отладочную страницу, где подробно будет описано, откуда и куда нас перенаправили. И ссылку дадут нажать.

EXCLUDE_URLS теоретически будет когда-нибудь отключать отладчик для указанных директорий. Оставил, чтобы не забыть попробовать через год. Вот еще бы для нужных поддоменов его вырубать…


Проблемы


Продукт немного сыроват. Различные его незначительные детали могут не работать или работать некорректно. Мне пришлось минут 15 поковырять шаблон и js-файлы, чтобы заработала кнопка ”Hide”. Для работы скрипта необходим jquery и плагин cookies (в cookie сохраняется состояние панели — закрыта/открыта). Плагин почему-то подключался уже после того, как скрипт toolbar.js вылетал с ошибкой.

Еще я долго мелял форматирование вывода времени во всех панелях: ну зачем мне видеть сотые доли миллисекунды? Но это всё мелочи, с которыми легко справиться или просто проигнорировать.

Могут быть сложности при использовании какого-нибудь хитрого middleware. Мне пришлось доработать напильником класс, организующий работу с субдоменами в рамках одного сервера.


Дополнение


Есть мнения, что данный форк этого тулбара немного лучше. Про функциональность я пока не могу точно сказать, а вот интерфейс…

Эхнифигасебе!!
За такой интерфейс отладчика кто-то мог бы продать душу дьяволу! Нужно попробовать.


Нашел ошибку — пиши в Хабрапочту.

Tags:
Hubs:
+52
Comments32

Articles