Как я могу получить все заголовки запросов в Django?
мне нужно получить все заголовки запросов Django. Из того, что я читал, Джанго просто сбрасывает все в request.META переменная вместе с большим количеством других данных. Что было бы лучшим способом получить все заголовки, которые клиент отправил в мой Django приложение?
Я собираюсь использовать их, чтобы построить httplib запрос.
6 ответов:
по словам документация
request.META- Это "стандартный словарь Python, содержащий все доступные заголовки HTTP". Если вы хотите получить все заголовки можно просто перебирать по словарю.какая часть вашего кода для этого зависит от вашего точного требования. В любом месте, которое имеет доступ к
requestдолжны сделать.обновление
мне нужно получить к нему доступ в классе Middleware но когда я перебираю его, я получаю много значений, кроме заголовков HTTP.
из документации:
за исключением
CONTENT_LENGTHиCONTENT_TYPE, как указано выше, каких-либоHTTPзаголовки в запросе преобразуются вMETAключи путем преобразования всех символов в верхний регистр, заменив дефисы на подчеркивания и добавлятьHTTP_префикс к имени.(Курсив добавлено)
для получения
HTTPтолько заголовки, просто фильтр по клавишам с префиксомHTTP_.обновление 2
не могли бы вы показать мне, как я мог бы построить словарь заголовков, отфильтровав все ключи из запроса.Мета-переменная, которая начинается с HTTP_ и удаляет ведущую часть HTTP_.
конечно. Вот один из способов сделать это.
import re regex = re.compile('^HTTP_') dict((regex.sub('', header), value) for (header, value) in request.META.items() if header.startswith('HTTP_'))
это еще один способ сделать это, очень похожее на Говиндан Манодж ответ выше:
import re regex_http_ = re.compile(r'^HTTP_.+$') regex_content_type = re.compile(r'^CONTENT_TYPE$') regex_content_length = re.compile(r'^CONTENT_LENGTH$') request_headers = {} for header in request.META: if regex_http_.match(header) or regex_content_type.match(header) or regex_content_length.match(header): request_headers[header] = request.META[header]это также захватит
CONTENT_TYPEиCONTENT_LENGTHзаголовки запросов вместе сHTTP_те.request_headers['some_key]==request.META['some_key'].изменить соответствующим образом, если необходимо включить/исключить определенные заголовки. Джанго списков куча, но не все из них здесь: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META
алгоритм Django для заголовков запросов:
- заменить дефис
-с подчеркиванием_- преобразование в верхний регистр.
- добавить
HTTP_для всех заголовков в исходном запросе, за исключениемCONTENT_TYPEиCONTENT_LENGTH.значения каждого заголовка должны быть неизменными.
Я не думаю, что есть простой способ получить только заголовки HTTP. Вы должны повторить запрос.Мета дикт, чтобы получить то, что вам нужно.
django-debug-toolbar использует тот же подход, чтобы показать информацию заголовка. Взгляните на этот файл ответственный за извлечение информации заголовка.
запрос.МЕТА.get ('HTTP_AUTHORIZATION')
/python3.6/site-packages/rest_framework/authentication.pyвы можете получить это из этого файла, хотя...
для чего это стоит, похоже, ваше намерение состоит в том, чтобы использовать входящий HTTP-запрос для формирования другого HTTP-запроса. Что-то вроде ворот. Есть отличный модуль django-revproxy выполняет именно это.
источник-довольно хорошая ссылка на то, как выполнить то, что вы пытаетесь сделать.
<b>request.META</b><br> {% for k_meta, v_meta in request.META.items %} <code>{{ k_meta }}</code> : {{ v_meta }} <br> {% endfor %}
Comments