BadHeaderError

Исключение BadHeaderError выбрасывается в Django, когда происходит попытка установить заголовок HTTP-ответа, содержащий недопустимые символы или пустое имя. Это исключение является подклассом ValueError и используется для обеспечения безопасности заголовков, передаваемых клиенту. Проверка выполняется в момент присвоения заголовка объекту ответа, что предотвращает потенциальные атаки через подмену заголовков.

Исключение автоматически поднимается методами __setitem__ и setdefault класса HttpResponse, а также при прямом присвоении значения заголовку через словарный синтаксис. Валидация проверяет, что имя заголовка содержит только буквы, цифры, дефисы и подчеркивания, а также не является пустой строкой. Кроме того, Django запрещает использование заголовков, начинающихся с '_' и '-', чтобы избежать конфликтов с внутренними заголовками сервера.

Синтаксис

pythonfrom django.http import HttpResponse, BadHeaderError

response = HttpResponse()
try:
  response['Header-Name'] = 'Header Value'
except BadHeaderError:
  # Handle invalid header
  pass

Пример

Попробуем установить заголовок с недопустимым символом в имени, например, пробелом:

pythonfrom django.http import HttpResponse, BadHeaderError

response = HttpResponse('Hello, World!')
try:
  response['Invalid Header Name'] = 'Some Value'
except BadHeaderError as error:
  print(f'Caught exception: {error}')

print(response.headers)

Результат выполнения кода:

python"Caught exception: HTTP header name 'Invalid Header Name' is invalid"
{}

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

Пример

Попробуем установить заголовок с пустым именем, что также вызовет ошибку:

pythonfrom django.http import HttpResponse, BadHeaderError

response = HttpResponse()
try:
  response[''] = 'Some Value'
except BadHeaderError as error:
  print(f'Caught exception: {error}')

Результат выполнения кода:

python"Caught exception: HTTP header name '' is invalid"

Пример

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

pythonfrom django.http import HttpResponse, BadHeaderError

response = HttpResponse()
try:
  response.set_header('Content-Type', 'text/html; charset=utf-8')
  response['Cache-Control'] = 'max-age=3600'
  response.setdefault('X-Frame-Options', 'DENY')
  print('Headers set successfully')
except BadHeaderError as error:
  print(f'Caught exception: {error}')

print(response.headers)

Результат выполнения кода:

python"Headers set successfully"
{'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'max-age=3600', 'X-Frame-Options': 'DENY'}

В этом примере все заголовки установлены корректно, и исключение не возникло.

Пример

Попробуем установить заголовок, начинающийся с запрещённого символа подчёркивания:

pythonfrom django.http import HttpResponse, BadHeaderError

response = HttpResponse()
try:
  response['_Hidden-Header'] = 'Secret Value'
except BadHeaderError as error:
  print(f'Caught exception: {error}')

Результат выполнения кода:

python"Caught exception: HTTP header name '_Hidden-Header' is invalid"

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

  • исключение Http404,
    которое выбрасывается при недоступности страницы
  • исключение BadRequest,
    которое возникает при некорректном запросе клиента
  • исключение ImproperlyConfigured,
    которое сигнализирует о неправильной настройке приложения
  • исключение ValidationError,
    которое возникает при ошибках валидации данных