Исключение MiddlewareNotUsed

Исключение MiddlewareNotUsed предназначено для сигнализации Django о том, что промежуточный слой (middleware) не должен использоваться в процессе обработки запросов. Когда middleware вызывает это исключение в своем методе __init__, Django удаляет его из цепочки middleware и не включает в обработку запросов. Это позволяет динамически включать или отключать middleware в зависимости от условий, таких как настройки приложения или окружение.

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

Синтаксис

pythonfrom django.core.exceptions import MiddlewareNotUsed

raise MiddlewareNotUsed("Сообщение о причине отключения")

Пример

Рассмотрим middleware, который отключается, если приложение запущено в тестовом окружении:

pythonfrom django.core.exceptions import MiddlewareNotUsed
from django.conf import settings

class OptionalMiddleware:
  def __init__(self, get_response):
    if settings.TESTING:
      raise MiddlewareNotUsed("Middleware disabled in test environment")
    self.get_response = get_response
    
  def __call__(self, request):
    response = self.get_response(request)
    return response

При запуске сервера с настройкой TESTING=True в консоли появится сообщение:

python"MiddlewareDisabled: Middleware disabled in test environment"

Пример

Middleware, который отключается при отсутствии необходимого приложения в INSTALLED_APPS:

pythonfrom django.core.exceptions import MiddlewareNotUsed
from django.conf import settings

class AppSpecificMiddleware:
  def __init__(self, get_response):
    if "myapp" not in settings.INSTALLED_APPS:
      raise MiddlewareNotUsed("myapp is not installed")
    self.get_response = get_response
    
  def __call__(self, request):
    response = self.get_response(request)
    return response

При отсутствии приложения myapp в настройках сервер выведет предупреждение:

python"MiddlewareNotUsed: myapp is not installed"

Пример

Middleware, который проверяет наличие определенной переменной окружения перед включением:

pythonfrom django.core.exceptions import MiddlewareNotUsed
import os

class ConditionalMiddleware:
  def __init__(self, get_response):
    enable_feature = os.getenv("ENABLE_ADVANCED_LOGGING")
    if not enable_feature or enable_feature.lower() != "true":
      raise MiddlewareNotUsed("Feature not enabled")
    self.get_response = get_response
    
  def __call__(self, request):
    response = self.get_response(request)
    return response

При запуске без установленной переменной ENABLE_ADVANCED_LOGGING=true сервер сообщит об отключении:

python"MiddlewareNotUsed: Feature not enabled"

Смотрите также

  • исключение ImproperlyConfigured,
    которое возникает при некорректной конфигурации Django
  • исключение SynchronousOnlyOperation,
    которое возникает при синхронном вызове из асинхронного контекста
  • исключение AppRegistryNotReady,
    которое возникает при обращении к моделям до загрузки приложений
  • исключение CommandError,
    которое возникает при ошибках в управляющих командах Django