Отладка в Django

    Новичкам в 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. Мне пришлось доработать напильником класс, организующий работу с субдоменами в рамках одного сервера.


    Дополнение


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

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


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

    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 32
    • +3
      Пользуюсь форком этого замечательного тулбара — в нем немного меньше багов чем в оригинале. Правда недавно вылезла пренеприятнейшая особенность — при включеном тулбаре отваливается jquery.ui и jquery плагины.
      • 0
        в форке какой-то совсем ерундовый sql-модуль. Или я что-то не понимаю?
        • 0
          Форк запросы и Explain показывает на одной странице, нормально форматирует запрос. Не может выполнить запрос и сделать SQL-профайлера нет. Правда, не знаю, насколько он необходим… Пользовался пару раз всего.

          Зато есть настоящий профайлер Python.
          Только его нужно отключать иногда — с ним всё работает в 8 раз медленнее.
        • +1
          + 1

          в debug-toolbar'е мне пришлось сразу переделывать стили, т.к. он отображался некорректно, в отличии от форка, да и немного удобнее он будет…
          • 0
            Спасибо, добавил в статью. Интерфейс впечатляет. И заработал без изменений в коде. Про jquery-плагины пока не смотрел…
          • –20
            В Symfony это было года 3 назад точно.
            • +2
              В Симфони чтоб выбрать больше одного объекта (разные таблички) в одном запросе — надо парсить руками через doSelectRC, тоесть еще хуже чем просто руками сделать запрос и непонятнее (да еще и надо за порядком следить, а если критерии взбредит выбрать после апдейта не «книги, читатели» а «читатели, книги» то всё поломается при hydrate'е).
            • 0
              хорошая штука, только, помню, с mootools она не подружилась, приходится на время отладки js отрубать из шаблонов
              • 0
                Оно и с jQuery не сразу подружилось. Я заметил проверку, не загружена ли jquery, при инициализации скриптов тулбара. Поставил свою jQuery 1.3.1 так, чтобы она грузилась раньше. С этих пор всё нормально.

                Про mootools ничего не могу сказать.
                Попробуйте взглянуть исходники, там всё просто.
                • 0
                  Спасибо за совет. Исходник глянул, патч написал, автору отправил, он закоммитил, дебаг-тулбар с mootools теперь дружит.
                  • 0
                    хотя нет, пока не дружит) автор патч слегка поправил (наверное, были на то причины), ну и после этого дружба опять завершилась)
                    • 0
                      rob hudson молодец, все починил)
              • +2
                Спасибо большое, очень не хватало такой вещи.
                • +2
                  Проблеммы

                  Проблемы
                  • +2
                    я один после прочения полез смореть https://dev.google.com?
                    • +1
                      я во время прочтения плез )
                    • –3
                      а вот меня наличие жиквери на странице сильно огорчает. переписываю под мутулз.
                      • +2
                        сильно огорчает? хммм… тестируйте себе на jquery а в продакшн mootols. проблем то…
                      • +1
                        Поставил форк, так как интерфейс больше понравился :) В джанго новичок, но думаю надо к отладке привыкать. Тем более люблю когда все под контролем.
                        • +1
                          Почему всегда, когда я что-то хочу установить и попробовать, на хабре появляется подробный ман по этому. Хабр читает мои мысли? Спасибо ^__^
                          • +1
                            Такой вопрос:
                            Насколько правильно, в плане производительности, писать подобные конструкции в коде проета?
                            if DEBUG:

                            Я имею ввиду не только Settings, но и повсемесно в коде
                            if DEBUG:
                            logging.info('опять упала !')

                            • +1
                              В данном случае использование if DEBUG совершенно оправдано: мы включаем консоль только в режиме отладки.
                              А насчет использования в коде — точно не знаю. Нужно потестировать. Возможно, поможет вывод сообщений с разными уровнями отладки…

                              Я еще не привык ловить такие мелочи (как, например, в статье по аналогичной проблеме в Perl). Мне вообще очень странно и непривычно, что страница генерится 43 миллисекунды, а не 2 секунды :-)
                              • 0
                                А насколько корректно использовать для объектов, которые разные в debug и production просто паттерн strategy? Ну и менять стратегию для дебага и продакшна.
                                • 0
                                  Ну и вообще, более глобальный вопрос. Насколько полезно писать полностью-ООП программы на питоне?

                                  Когда-то я написал полностью-ООП движок для PHP, чем-то походящий на Turbine под Java. Искоренил «скриптовый» подход везде где можно, остались только классы организованные по базовым паттернам. Потом свершилась работающая версия… увидел сколько времени всё это выполняется, и выбросил код в помойку.
                                • +1
                                  конкретно в случае logging стоит писать logging.debug('опять упала!')
                                  уровень выводимых сообщений настраивается
                                  • 0
                                    Верно говорят про logging.debug('опять упала !'), но не стоит, конечно, передавать ему какой-нибудь объект, который при str() выдаст простыню на 100 килобайт и задумается на две секунды.
                                    • 0
                                      Вопрос был не про logging.debug
                                  • +1
                                    Архикрутая вещь. Спасибо огромное за обзор.
                                    • +1
                                      Шикарно, множество print в коде исчезнут :)
                                      • +1
                                        «Жепь ебрило» :) отлично

                                        Спасибо за обзор.
                                        • 0
                                          Спасибо, это спасет кучу нервов и драгоценного времени.
                                          • 0
                                            За такой интерфейс отладчика кто-то мог бы продать душу дьяволу! Нужно попробовать.

                                            Ха, по сравнению с внешним вид нынешнего, на ноябрь 09, стандартного, не-форкнутого дебаг тулбара (0.8.х) это — просто крокодил. Штука стала выглядеть ГОРАЗДО круче

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.