Рубрики
Без рубрики

Комплексное руководство по промежуточному программному обеспечению Джанго

Что такое промежуточное программное обеспечение? Как следует из названия, промежуточное программное обеспечение – это в основном механизм, который приходит я … Tagged с Python, Django, WebDev.

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

Изображение по Джоди Баучер

Промежуточное программное обеспечение также может вернуть ответ непосредственно вместо того, чтобы пересылать запрос дальше по цепочке. Например, Джанго CSRF Middleware Проверяет, если запрос поступает из действительного происхождения (обычно тот же домен, что и сервер) и немедленно возвращается с запретным ответом 403, если нет. Это помогает предотвратить въезд потенциально вредоносного запроса в систему.

Промежуточное программное обеспечение всегда Глобал То есть он применяется к каждому запросу, входящему в систему.

1. Запросы фильтрации

Промежуточное программное обеспечение может быть записано, чтобы отфильтровать недействительные или потенциально злонамеренные запросы и попросить их немедленно вернуться (обычно с ответом на ошибку), что блокирует их от дальнейшего действия. Одним из придуманных примеров является промежуточное программное обеспечение CSRF, упомянутое выше, которое отфильтровывает запросы, отправленные из разных доменов. Другим возможным примером может быть промежуточное программное обеспечение на основе ролей RBAC ( ), которое не позволяет пользователям читать или изменять ресурсы, которые они не разрешены для доступа. Или еще одним примером является промежуточное программное обеспечение Geo-Blocking, которое отфильтровывает запросы из определенных географических мест.

2. Вводить данные в запросы

Промежуточное программное обеспечение можно использовать для введения дополнительных данных в запрос, которые можно использовать дальше внутри приложения. Мы можем взять пример Джанго Аутентификация промежуточное программное обеспечение , который добавляет Пользователь объект на каждый действительный запрос. Это удобный способ для представления и другого промежуточного программного обеспечения для доступа к деталям зарегистрированного пользователя, просто позвонив request.user Анкет

3. Выполнение журнала, аналитики и других разных задач

Некоторое промежуточное программное обеспечение на самом деле вообще не изменяет запрос/ответ, а просто используйте информацию, содержащуюся внутри. Другими словами, это промежуточное программное обеспечение «только для чтения». Например, представьте себе промежуточное программное обеспечение Analytics, которое хранит в базе данных, детали всех запросов, входящих в систему, такие как связанный пользователь, URL, временная метка и т. Д. Эти данные позже будут проанализированы для выявления полезной информации или тенденций. Такое промежуточное программное обеспечение просто прочитало бы содержимое запроса и создает/обновляет некоторые связанные записи в базе данных, а затем позволило бы прозрачно пройти. Другим примером будет промежуточное программное обеспечение для мониторинга использования, которое отслеживает, сколько их квоты использования пользователь исчерпал.

Структура базового промежуточного программного обеспечения в Джанго выглядит так:

class ExampleMiddleware:

    def _init_(self, get_response):
        self.get_response = get_response

    def _call_(self, request):

        # Code that is executed in each request before the view is called

        response = self.get_response(request)

        # Code that is executed in each request after the view is called
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        # This code is executed just before the view is called

    def process_exception(self, request, exception):
        # This code is executed if an exception is raised

    def process_template_response(self, request, response):
        # This code is executed if the response contains a render() method
        return response

Первый метод, __init__ , это конструктор для нашего класса Python. Это называется только один раз, в то время, когда запускается сервер. Здесь мы выполняем любые инициализации или другие одноразовые задачи, которые мы можем захотеть выполнить.

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

Второй метод, __call__ Позволяет назвать объект нашего класса как функция! То есть он превращает его в Callible Анкет Здесь мы поместили нашу настоящую логику промежуточного программного обеспечения. Этот метод называется Django Framework для вызова наше промежуточное программное обеспечение.

Остальные три – это специальные методы «крючка», которые позволяют вам вызывать ваше промежуточное программное обеспечение в определенных условиях. Обратите внимание, что они необязательны, и вы можете реализовать их только в том случае, если вам нужны функциональность, которые они предоставляют. Только первые два метода, __init__ и __call__ , требуются в рамках Django Framework для вашего промежуточного программного обеспечения должным образом.

Давайте рассмотрим методы крюка более подробно.

process_view

Этот метод называется каждый раз, когда Джанго получает запрос и направляет его на представление. Чем он отличается от __call__ метод? Что ж, здесь у нас есть доступ к функции представления, которую Django направляет запрос вместе с любыми дальнейшими аргументами (ARGS и Kwargs), которые будут переданы ему. Например, параметры пути и их значения обычно передаются в Kwargs, поэтому в случае, если наше промежуточное программное обеспечение требует доступа к ним, оно должно реализовать Process_view метод

Метод должен вернуть либо Нет , в этом случае Django продолжит обрабатывать запрос, как обычно, или httpresponse, и в этом случае он немедленно вернется с этим ответом.

process_exception

Этот метод вызывается всякий раз, когда представление повышает исключение, которое не попадает в саму мнение. Следовательно, процесс_xpection вызывается после Запрос достиг и вернулся с точки зрения.

Похоже на вышесказанное,. Process_exception Метод должен либо вернуть Нет или httpresponse.

process_template_response

Этот метод также вызывается после того, как представление завершило выполнение. Его вызывается только в том случае, если результирующий ответ содержит render () Метод, который указывает, что шаблон выполняется. Вы можете использовать этот метод для изменения содержания шаблона, включая его контекстные данные, если это необходимо.

После того, как вы написали свой пользовательский класс промежуточного программного обеспечения, его необходимо зарегистрировать в вашем проекте Django, чтобы добавить его в последовательность промежуточного программного обеспечения, через который проходит каждый запрос. Чтобы сделать это, просто добавьте его как запись в Промежуточное программное обеспечение Список в вашем основном настройки.py файл:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    .
    .
    .
    # Add your custom middleware to this list
]

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

Обратите внимание, что порядок, в котором промежуточное программное обеспечение присутствует в этом списке, очень важен. Это связано с тем, что какое -то промежуточное программное обеспечение может зависеть от другого функционирования должным образом или даже препятствовать правильному функционированию другого. Большинство связанных с безопасностью промежуточное программное обеспечение, как правило, находится в начале списка, поэтому они могут ловить и отфильтровать потенциально вредные запросы рано. Как правило, большинство индивидуальных промежуточных программных программных программных программных программных программных программных программных программных программных программных программных программных программных программных программных программных программных программных программных программно добавляется к окончанию списка. Однако это не всегда верно, особенно если, как отмечалось выше, ваше пользовательское промежуточное программное обеспечение связано с Seecurity. Вы должны решить, где разместить свою промежуточную запись в каждом конкретном случае.

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

💡 Примечание: мы будем охватывать только промежуточное программное обеспечение в этом практическом разделе, а не настройку остальной части проекта Django. Если вы не знакомы с основами Джанго, Официальный учебник это отличное место для начала.

Countrefestsmiddleware

Наш Countrequestsmiddleware Похоже:

class CountRequestsMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response
        self.count_requests = 0
        self.count_exceptions = 0

    def __call__(self, request, *args, **kwargs):
        self.count_requests += 1
        logger.info(f"Handled {self.count_requests} requests so far")
        return self.get_response(request)

    def process_exception(self, request, exception):
        self.count_exceptions += 1
        logger.error(f"Encountered {self.count_exceptions} exceptions so far")

В конструкторе мы инициализируем две переменные, count_requests и count_exceptions Анкет В __call__ Метод, который используется с помощью каждого запроса, мы увеличиваем значение count_requests а также регистрировать это.

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

Мы не определяем другие методы крючка, так как нам не нужны их.

SetUseragentMiddleware

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

class SetUserAgentMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request, *args, **kwargs):
        request.user_agent = user_agents.parse(request.META["HTTP_USER_AGENT"])
        return self.get_response(request)

Здесь мы захватываем значение заголовка агента пользователя ( Запрос. Meta ["http_user_agent"] ) и анализ его с помощью библиотеки. Затем мы устанавливаем результат в качестве атрибута того же Запрос Объект, чтобы позднее средние войны и представления могли получить к нему доступ.

💡 ПРИМЕЧАНИЕ: Это промежуточное программное обеспечение в основном представляет собой повторное промежуточное программное обеспечение в django-user-Agents упаковка. Хотя это хорошо для учебных целей, в реальном приложении всегда используется легкодоступные решения. Не изобретайте колесо!

Blockmobilemiddleware

Скажем, мы пишем веб -приложение, которое по какой -то причине совместим только с настольные браузеры (возможно, это онлайн -игра, которая требует поддержки мыши). Нам понадобится какой -то способ обнаружения и блокировки запросов, которые поступают из мобильных браузеров. Поскольку мы уже написали SetUseragentMiddleware промежуточное программное обеспечение, мы можем воспользоваться этим и просто написать еще одно промежуточное программное обеспечение, которое проверяет значение request.user_agent и немедленно возвращается, если он не поддерживается. Таким образом, нам не придется усложнять наш код представления с помощью проверки пользовательских агентов, поскольку мы можем гарантировать, что любой запрос, который достигает нашего оно, поступает из поддерживаемого браузера.

class BlockMobileMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request, *args, **kwargs):
        if request.user_agent.is_mobile:
            return HttpResponse("Mobile devices are not supported", status=400)
        return self.get_response(request)

Здесь мы просто проверяем значение логического is_mobile Свойство и, если это правда, немедленно верните ответ 400 (плохой запрос) с соответствующим сообщением об ошибке.

Обратите внимание, что это зависит от request.user_agent Атрибут, который вводится SetUseragentMiddleware Анкет Следовательно, SetUseragentMiddleware всегда должен приходить до Blockmobilemiddleware В списке промежуточного программного обеспечения в вашем файле настроек.

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

Полный исходный код для примера доступен на GitHub Здесь Анкет

Если вы хотите узнать больше о промежуточном программном обеспечении Django, я не могу рекомендовать Официальная документация достаточно!

Изображение обложки от Mustangjoe от Pixabay

Оригинал: “https://dev.to/bikramjeetsingh/a-comprehensive-guide-to-django-middleware-2fee”