Как я могу получить все заголовки запросов в Django?



мне нужно получить все заголовки запросов Django. Из того, что я читал, Джанго просто сбрасывает все в request.META переменная вместе с большим количеством других данных. Что было бы лучшим способом получить все заголовки, которые клиент отправил в мой Django приложение?



Я собираюсь использовать их, чтобы построить httplib запрос.

770   6  

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 для заголовков запросов:

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

    Ничего не найдено.