Как я могу получить все заголовки запросов в Django?
мне нужно получить все заголовки запросов 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']
.
измените соответственно, если вам нужно включить / опустить определенные заголовки. Django перечисляет кучу, но не все из них здесь: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META
алгоритм Django для заголовков запросов:
- заменить дефис
-
с подчеркиванием_
- преобразовать в верхний регистр.
- добавить
HTTP_
для всех заголовков в исходном запросе, за исключениемCONTENT_TYPE
иCONTENT_LENGTH
.
значения каждого заголовка должны быть неизмененными.
Я не думаю, что есть простой способ получить только заголовки HTTP. Вы должны повторить запрос.META dict, чтобы получить все, что вам нужно.
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 %}