Введение в Django

Искусство отладки

Показывать лекцию целиком

Цель лекции: Ознакомиться с особенностями отладки Django; рассмотреть понятие протоколирования и его особенностями; научиться использовать интерактивный отладчик; ознакомиться с отладочной панелью.

Ключевые термины: django, журнал, модуль, python ,панель, отладка, функция, протокол, файл, команда, код, path, фильтр, обработчик, трассировка

В этой лекции мы узнаем три вещи о веб-разработке на Django, которые должен знать каждый программист. Это концепции и техники, которые вам понадобятся, если что-то пойдем не так.

Протоколирование

Каждое приложение, запущенное в рабочей фазе, должно иметь включенное ведение файла отчетов; если этого не сделать, потом будет трудно объяснить, что и где пошло не так.

Django использует базовое протоколирование Python, так что мы рассмотрим детально базовое протоколирование Python в следующем разделе и увидим, как мы можем использовать службу протоколирования для записи в файл отчета в Django.

Формальное определение протоколирования – это отслеживание событий программного обеспечения. Разработчики вызывают службу протоколирования, чтобы определить, что событие произошло или происходит. Протоколирование может содержать некоторое описание или значение какой-либо важной переменной, которое нужно отследить.

Модуль Python logging поставляется с пятью функциями для ведения файлов отчетов, которые распределены по категориям в зависимости от серьезности события. Это debug(), info(), warning(), error() и critical().

Они подразделяются на категории в порядке их серьезности (начиная от наименее серьезной до самой серьезной):

  • debug(): используется при фиксации ошибок и обычно имеет подробную информацию о данных.
  • info(): создает файл отчета, когда вещи работают, как они должны.В основном говорит о том, было ли выполнение успешно или нет.
  • warning(): возникает при наступлении некоторых неожиданных событий. Это на самом деле не останавливает выполнение, но он может остановить выполнение в будущем. Например "недостаточно места на диске".
  • error(): это следующий уровень предупреждения, которое гласит, что возможен останов выполнения некоторых функций.
  • critical(): это самый высокий уровень любой функции протоколирования. Возникает в случае, когда очень серьезная ошибка может остановить выполнение всей программы.
  • Модуль logging делится на следующие четыре категории:

  • Средства ведения журнала: Журнал является точкой входа для сообщения журнала системы. Программы записи протоколирования информации ведут файлы отчетов, которые затем обрабатываются вне зависимости, должен ли быть вывод на консоль или запись в файл.
  • Каждый регистратор состоит из предыдущих пяти функций протоколирования. Каждое сообщение, которое записывается в журнал называется записью журнала. Запись журнала содержит серьезность файла отчета, а также важные переменные файла отчета или детали, такие как код ошибки или полная трассировка стека.

    Средства ведения журнала, сами имеют уровень регистрации, который работает так: если уровень регистраций сообщения журнала больше или равен уровню регистрации журнала, тогда сообщение будут обработано далее для протоколирования; в противном случае оно будет игнорироваться средством ведения журнала.

    Когда предварительная обработка средства ведения журнала для оценки регистрации будет завершена и в результате журнал должен быть обработан, а затем сообщение передается в обработчик.

  • Обработчики: Обработчики на самом деле решить, что делать с лог-сообщением. Они несут ответственность за выполнение действий для записи журнала, таких как вывод на консоль или в файл, или отправка его по сети.
  • Так же, как средства ведения журнала, обработчики также имеют уровень регистрации. Сообщения журнала игнорируются обработчиком, если уровень регистрации записи журнала не больше или равен уровню обработчика.

    Несколько обработчиков могут быть прикреплены к средству ведения журнала, например, может быть обработчик для ведения средства ведения журнала, которое отправляет сообщения ERROR и CRITICAL и по электронной почте, тогда как другой обработчик может записывать тот же самый журнал в файл для последующего анализа отладки.

  • Фильтры: Фильтр добавляет дополнительную оценку, когда запись журнала передается от средства журналирования обработчику. Поведением по умолчанию является то, что он начинает обработку письма, когда уровень регистрации сообщения встречается с уровнем обработчика.
  • Это процесс может быть прерван для дополнительной оценки путем применения фильтра.

    Например, фильтр разрешает только один источник для записи сообщения ERROR с обработчиком.

    Фильтр также может использоваться для изменения приоритета записи журнала, так что средство журналирования и обработчик запускаются соответственно.

  • Средства форматирования: Последним шагом перед тем, как сообщение журнала действительно будет запротоколировано, которое будет находиться в текстовом формате, является средство форматирования, фактически форматирует запись журнала, которая состоит из форматированных строк Python.
  • Чтобы включить ведение журнала в нашем приложении, мы сначала создадим средство ведения журнала. Нам нужно создать словарь регистрации в файле settings.py, который описывает средства журналирования, обработчики, фильтры и средства форматирования.

    Полную документация о настройке ведения журнала можно найти на httpS://docs.Python.org/2/Library/Logging.config.HTML

    Следующий фрагмент является простым примером настройки ведения журнала:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'simple': {
                'format': '%(levelname)s %(message)s'
            },
        },
        'handlers': {
            'file':{
                'level':'DEBUG',
                'class': 'logging.FileHandler',
                'formatter': 'simple',
                'filename': 'logs/debug.log',
               }
        },
        'loggers': {
            'django': {
            'handlers':['file'],
            'propagate': True,
            'level':'INFO',
        },
        }
    }
    

    Этот журнал установки определяет один регистратор (Django), тот что нужен для запроса Django и обработчик (файл), который записывает в файл журнала с модулем форматирования.

    Мы будем использовать то же самое для тестирования протоколирования для нашего проекта mytweet.

    Теперь нам нужно сделать запись журнала в представлении, где мы хотим отслеживать событие.

    Чтобы протестировать проект, мы обновим наш класс перенаправления профиля пользователя, чтобы он делал запись в журнал, если неавторизованный пользователь пытается получить к нему доступ, и, кроме того, когда зарегистрированный пользователь пытается открыть URL-адрес.

    Откройте файл tweet/view.py и измените класс UserRedirect в соответствии со следующим:

    class UserRedirect(View):
        def get(self, request):
            if request.user.is_authenticated():
                logger.info('authorized user')
                return HttpResponseRedirect('/user/'+request.user.username)
            else:
                logger.info('unauthorized user')
                return HttpResponseRedirect('/login/')
    

    Кроме этого, инициализируйте средство ведения журнала с помощью оператора import и добавьте следующий код для выполнения предыдущего кода:

    import logging
    logger = logging.getLogger('django')
    

    Вот так. Теперь, откройте браузер и кликните по URL-адресу http://localhost:8000/prоfile.

    Вы будете перенаправлены на страницу входа, если вы еще не вошли в систему.

    Теперь откройте файл debug.log. Он содержит информацию о неавторизованном пользователе, это означает, что наш журнал прекрасно работает:

    INFO unauthorized user

    Отладка

    Отладка — это процесс поиска и устранения ошибок (багов). Когда мы разрабатываем веб-приложения с помощью Django, у нас часто появляется необходимость знать значения переменных, отправленных в запросе AJAX.

    Инструментами для отладки являются:

  • Отладочная панель Django
  • IPDB (интерактивный отладчик)
  • Отладочная панель Django

    Это набор панелей, используемый для отображения различных сведений о запросе / ответе текущей страницы и раскрывающий больше подробностей при нажатии на панель.

    Вместо того чтобы просто отображать отладочную информации в HTML комментариях, отладочная панель Django отображает его более продвинутым способом.

    Установка отладочной панели Django

    Чтобы установить отладочную панель Django, выполните следующую команду:

    pip install django-debug-toolbar

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

    Добавьте параметр debug_toolbar к переменной INSTALLED_APPS в файле settings.py:

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'user_profile',
        'tweet',
        'social.apps.django_app.default',
        'tastypie',
        'debug_toolbar',
    )
    

    Это более чем достаточно для простого проекта Django. Отладочная панель Django будет автоматически корректировать себя, когда сервер запущен в режиме разработки.

    Перезапустите сервер.Как вы можете видеть, в правой часть профиля пользователя есть панель. Отладочная панель Django имеет много панелей, из них есть некоторые, установленные по умолчанию, как мы видим на предыдущем скриншоте, а некоторые являются сторонними, которые могут быть установлены по желанию.

    Теперь мы обсудим панели, установленные по умолчанию:

    VersionPath: debug_toolbar.panels.versions.VersionsPanel. Эта панель показывает основную информацию, такую как версию Python, Django и других установленных приложений, если такая информация доступна

    Использование ресурсов: Показывает потребление ресурсов Django на машине сервера.

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

    SettingsPath:debug_toolbar.panels.Settings.SettingsPanel. 

    Список параметров которые определены в файле settings.py являются заголовками

    Path: debug_toolbar.panels.headers.HeadersPanel	

    Эта панель показывает переменные фреймворка, начиная от переменных представлений, которые так же являются переменными ratancs; затем Cookies, Session, переменные GET, POST, они могут быть полезны при отладке форм отправки.

    SqlPath: debug_toolbar.panels.sql.SQLPanel

    Эта панель очень важна, так как содержит SQL-запросы, создаваемые к базе данных при запросе страницы. Это очень помогает во время масштабирования приложения, запросы могут быть здесь просмотрены и скомбинированы вместе, чтобы уменьшить промахи по базе данных и улучшить производительность запроса страницы.

    Показывается также фрагмент кода, который делает SQL-запрос, что очень полезно при отладке приложения.

    StaticFilesPath: debug_toolbar.panels.staticfiles.StaticFilesPanel
    TemplatePath: debug_toolbar.panels.templates.TemplatePanel

    Это показывает нам список шаблонов и контекста, связанного с данным запросом

    CachePath: debug_toolbar.panels.cache.CachePanel

    Если мы включили кэш. то здесь отобразятся детали кэш-попаданий по данному URL-адресу

    SignalPath: debug_toolbar.panels.signals.SignalsPanel

    Эта панель показывает список сигналов и их аргументов и получателей

    LoggingPath: debug_toolbar.panels.logging.LoggingPanel

    Если вы включили протоколирование, эта панель отобразит сообщения журнала, как показано на следующем скриншоте:

    RedirectPath: debug_toolbar.panels.redirects.RedirectsPanel

    Когда присутствует страница перенаправления на URL-адрес, включите ее для отладки промежуточной страницы. Как правило вы не можете отладить URL перенаправления, таким образом, по умолчанию эта функция отключена

    IPDB - интерактивный способ перебора ошибок

    Ipdb — интерактивный отладчик исходного кода для Python программ.

    Выполните следующую команду, чтобы установить Ipdb:

    pip install ipdb

    Ipdb является интерактивным способом отладки приложения Python. После установки Ipdb, для использования его в любой функции, просто напишите следующий код:

    import ipdb; ipdb.set_trace()

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

    Сочетания клавиш для ipdb (когда вы находитесь в активной консоли):

    n: следующий элемент

    ENTER: Повторить предыдущее

    quit: выход

    p <variable>: Печатает значение

    c: продолжить

    l: список, где вы находитесь

    s: шаг в подпрограмме

    r: продолжать до конца подпрограммы

    !<python command="">: Выполнить команду Python внутри активной консоли

    Можно сделать больше, чем то, что рассматривается в настоящей лекции. Вам были даны основы отладки, которые мы собираемся использовать в наших проектах Django. Вы узнали, как войти и отладить наш код для лучшей и более эффективной практики кодирования. Мы также узнали, как использовать Ipdb для больших возможностей отладки.

    В следующей лекции вы узнаете о различных способах развертывания наших проектов Django.

    Контрольные вопросы

  • Для чего необходимо использовать отладку?
  • Какие команды доступны для интерактивного отладчика?
  • Какие панели администратора и с какими функциями вы можете назвать?
  • Что такое протоколирование?
  • Какие категории модуля logging существуют?
  • Упражнения

    Упражнение 1.

    Установите панель MOngoDB

    Упражнение 2.

    Установите панель Template Profiler

    Упражнение 3.

    Установите панель User

    Упражнение 4.

    Установите панель Template Timings

    Список рефератов

  • Особенности отладки web-приложений
  • Обзор сторонних панелей отладки
  • Расширенный обзор IPDB
  • Искусство консольной отладки
  • Журналирование при разработке веб-сервисов
  • Фильтрация в работе веб-проектов
  • Принципы промышленной веб-разработки
  • Отладка веб-приложения и его учет при разработке технического задания
  • Безопасность веб-приложения на этапе эксплуатации. Журналирование.
  • Отладка кода как часть тестирования программного кода
  • Краткие итоги

  • ознакомились с особенностями отладки Django
  • рассмотрели понятие протоколирования
  • научились использовать интерактивный отладчик
  • ознакомились с отладочной панелью
  • Рассмотрели назначение каждой из отладочной панелей
  • Ознакомились с Модулем Python logging
  • Изучили функции для ведения журналов отчетов
  • рассмотрели основные команды IPDB
  • рассмотрели способ установки отладочной панели
  • реализовали код перенаправления пользователя
  • Вернуться к учебному плану