BadHeaderError
Исключение BadHeaderError выбрасывается в Django,
когда происходит попытка установить заголовок HTTP-ответа,
содержащий недопустимые символы или пустое имя.
Это исключение является подклассом ValueError
и используется для обеспечения безопасности заголовков,
передаваемых клиенту. Проверка выполняется в момент
присвоения заголовка объекту ответа, что предотвращает
потенциальные атаки через подмену заголовков.
Исключение автоматически поднимается методами
__setitem__ и setdefault класса
HttpResponse, а также при прямом присвоении
значения заголовку через словарный синтаксис.
Валидация проверяет, что имя заголовка содержит только
буквы, цифры, дефисы и подчеркивания, а также не является
пустой строкой. Кроме того, Django запрещает использование
заголовков, начинающихся с '_' и '-',
чтобы избежать конфликтов с внутренними заголовками
сервера.
Синтаксис
from django.http import HttpResponse, BadHeaderError
response = HttpResponse()
try:
response['Header-Name'] = 'Header Value'
except BadHeaderError:
# Handle invalid header
pass
Пример
Попробуем установить заголовок с недопустимым символом в имени, например, пробелом:
from 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)
Результат выполнения кода:
"Caught exception: HTTP header name 'Invalid Header Name' is invalid"
{}
Как видно из примера, заголовок не был добавлен, и было выброшено исключение с информативным сообщением о недопустимом имени.
Пример
Попробуем установить заголовок с пустым именем, что также вызовет ошибку:
from django.http import HttpResponse, BadHeaderError
response = HttpResponse()
try:
response[''] = 'Some Value'
except BadHeaderError as error:
print(f'Caught exception: {error}')
Результат выполнения кода:
"Caught exception: HTTP header name '' is invalid"
Пример
Корректный способ установки заголовков с использованием
метода set_header, который также может выбрасывать
исключение при недопустимых значениях:
from 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)
Результат выполнения кода:
"Headers set successfully"
{'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'max-age=3600', 'X-Frame-Options': 'DENY'}
В этом примере все заголовки установлены корректно, и исключение не возникло.
Пример
Попробуем установить заголовок, начинающийся с запрещённого символа подчёркивания:
from django.http import HttpResponse, BadHeaderError
response = HttpResponse()
try:
response['_Hidden-Header'] = 'Secret Value'
except BadHeaderError as error:
print(f'Caught exception: {error}')
Результат выполнения кода:
"Caught exception: HTTP header name '_Hidden-Header' is invalid"
Смотрите также
-
исключение
Http404,
которое выбрасывается при недоступности страницы -
исключение
BadRequest,
которое возникает при некорректном запросе клиента -
исключение
ImproperlyConfigured,
которое сигнализирует о неправильной настройке приложения -
исключение
ValidationError,
которое возникает при ошибках валидации данных