Новый формат middleware в Django 2

MIddleware (промежуточный слой) используются для модификации объекта приходящего запроса в представление (view) или для модификации объекта ответа, возвращаемого из представления. Они позволяют нам изменять запросы/ответы глобально.

Старый формат middleware

До версии Django 1.10, было 5 точек перехвата. Любой класс, имеющий методы process_request(), process_view(), process_exception(), process_template_response() и process_response() мог использоваться как middleware и указываться в настройка settings.py в параметре MIDDLEWARE_CLASSES.

Два первыз метода — process_request() и process_view() вызывались до вызова представления (view). Следующие три метода process_exception(), process_template_response() и process_response() исполнялись после того, как пердставление вернет объект ответа (response).

Новый формат middleware

Самое важное изменение при переводе проекта на Django 2 — это изменение MIDDLEWARE_CLASSES на MIDDLEWARE в файле settings.py, а MIDDLEWARE_CLASSES удалено.

Старые middleware должны быть классом, тогда как новые могут быть любыми вызываемыми объектами, которые принимают get_response или при ответе принимают request и возвращают response.

class TimeStampMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        request.timestamp = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
        response = self.get_response(request)
        return response

Здесь get_response может быть представлением, которое возвращает ответ, или следующим middleware в списке. Следовательно, запрос обрабатывается в указанном порядке middleware, а ответ - в обратном порядке.

Для активации своего middleware необходимо добавить путь к нему в MIDDLEWARE в файле настроек settings.py:

MIDDLEWARE = [
    '...',
    'my_app.middleware.TimeStampMiddleware',
    '...',
]

Обновление middleware

Django предоставляет миксин django.utils.deprecation.MiddlewareMixin, который должен расширять возможности старого формата middleware. Таким образом MiddlewareMixin преобразовывает объект класса в вызываемый. Например:

from django.utils.deprecation import MiddlewareMixin

class CustomMiddleware(MiddlewareMixin):
    def process_request(self, request):
        # Process the request
        pass

    def process_response(self, request, response):
        # Process the response
        return response

 

Поделитесь с другими:

Представления-классы
(Class-Based Views)

Детальное описание и структура классов Django.

Исправление ошибок, Django 2.1.8

Выпущена новая версия Django 2.1.8, в которой исправлена ошибка в админке, допущенная в версии 2.1.7: запрещено редактировать inline-элементы для ManyToManyField, если у пользователя есть только разрешение на просмотр.

Аутентификация в Django: полный пример входа, выхода и смены пароля

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

Django 2.2 предварительный выпуск 1

Выпущен релиз-кандидат 1 версии Django 2.2, в котором вы можете предварительно протестировать некоторые новые возможности перед выпуском Django 2.2.

Поиск узких мест производительности проекта на Django

При оптимизации производительности веб-приложения распространенная ошибка — начинать с оптимизации самой медленной страницы (или API). Помимо учета времени отклика, мы также должны учитывать трафик, который он получает, чтобы определить порядок оптимизации. В этой статье мы расскажем о веб-приложении Django, найдем узкие места с высокой эффективностью, а затем приступим к их оптимизации для повышения производительности.

Просмотр SQL запросов Django

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

Как подключить виджет выбора даты в Django

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

Исправление ошибок, Django 2.0.13

Сегодня был осуществлен новый выпуск исправлений Django 2.0.13. Исправлен сбой в django.utils.numberformat.format_number(), когда число имеет более 200 цифр (#30177).

Новый формат middleware в Django 2

MIddleware (промежуточный слой) используются для модификации объекта приходящего запроса в представление (view) или для модификации объекта ответа, возвращаемого из представления. Они позволяют нам изменять запросы/ответы глобально.

Массовое обновление записей в Django используя аннотации и подзапросы

Как массово обновлять записи в Django с помощью аннотаций и подзапросов.

Структура шаблонов в Django

Существует два основных способа организации структуры шаблонов Django: на уровне приложений и пользовательский, на уровне проекта, который указывается в setting.py.