Как я могу получить все заголовки запросов в 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 для заголовков запросов:

  1. заменить дефис - с подчеркиванием _
  2. преобразовать в верхний регистр.
  3. добавить 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 %}