Как я могу получить все заголовки запросов в Django?
107
Мне нужно получить все заголовки запросов Django. Из того, что я прочитал, Django просто выгружает все в request.METAпеременную вместе с множеством других данных. Как лучше всего получить все заголовки, которые клиент отправил моему приложению Django?
Я собираюсь использовать их для создания httplibзапроса.
Согласно документацииrequest.META , это «стандартный словарь Python, содержащий все доступные заголовки HTTP». Если вы хотите получить все заголовки, вы можете просто просмотреть словарь.
Какая часть вашего кода это делать, зависит от ваших конкретных требований. Подойдет любое место, к которому есть доступ request.
Обновить
Мне нужно получить к нему доступ в классе промежуточного программного обеспечения, но когда я повторяю его, я получаю много значений, кроме заголовков HTTP.
Из документации:
За исключением CONTENT_LENGTHи CONTENT_TYPE, как указано выше, любые HTTPзаголовки в запросе преобразуются в METAключи путем преобразования всех символов в верхний регистр, замены дефисов символами подчеркивания и добавления HTTP_префикса к имени .
(Курсив добавлен)
Чтобы получить только HTTPзаголовки, просто отфильтруйте их по ключам с префиксом HTTP_.
Обновление 2
не могли бы вы показать мне, как я могу создать словарь заголовков, отфильтровав все ключи из переменной request.META, которые начинаются с HTTP_, и вычеркните ведущую часть HTTP_.
Мне нужно получить к нему доступ в классе промежуточного программного обеспечения, но когда я повторяю его, я получаю много значений, кроме заголовков HTTP.
Мриданг Агарвалла 08
Спасибо, Манодж. Просто из любопытства - не могли бы вы показать мне, как я могу создать словарь заголовков, отфильтровав все ключи из request.METAпеременной, которые начинаются с a, HTTP_и вычеркнув ведущую HTTP_часть. Возможно ли это с помощью лямбда-функций? (Я думаю, что они называются лямбда-функциями). Я спрашиваю об этом, потому что, вероятно, я бы продолжил делать это долго, сначала перебирая их, затем проверяя, начинается ли оно с a, HTTP_а затем добавляю его в новый словарь. Еще раз спасибо.
Мриданг Агарвалла 08
Еще раз спасибо, Манодж. Я немного изменил его, чтобы использовать lstrip('HTTP_')вместо регулярного выражения. :)
Мриданг Агарвалла 08
3
@Mridang Agarwalla: на lstripсамом деле не будет делать то, что вы просите. lstripудалит все ведущие символы, которые соответствуют любым символам в строке, которую вы ей даете, поэтому, если у вас есть заголовок, "HTTP_TOKEN_ID"он вернется "OKEN_ID", потому что "T"в начале "TOKEN"совпадает с символом в строке, переданной в lstrip. Способ сделать это prefix = 'HTTP_'; header = header[len(prefix):].
Нечувствительный к регистру объект типа dict, который обеспечивает доступ ко всем заголовкам с префиксом HTTP (плюс Content-Length и Content-Type) из запроса.
Название каждого заголовка стилизовано с заглавной буквой (например, User-Agent) при отображении. Вы можете обращаться к заголовкам без учета регистра:
>>> request.headers
{'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6',...}>>>'User-Agent'in request.headers
True>>>'user-agent'in request.headers
True>>> request.headers['User-Agent']Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)>>> request.headers['user-agent']Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)>>> request.headers.get('User-Agent')Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)>>> request.headers.get('user-agent')Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)
Чтобы получить все заголовки, вы можете использовать request.headers.keys()или request.headers.items().
Я не думаю, что есть простой способ получить только заголовки HTTP. Вам нужно выполнить итерацию request.META dict, чтобы получить все, что вам нужно.
django-debug-toolbar использует тот же подход для отображения информации заголовка. Взгляните на этот файл, отвечающий за получение информации заголовка.
Как бы то ни было, похоже, вы намерены использовать входящий HTTP-запрос для формирования другого HTTP-запроса. Вроде как шлюз. Есть отличный модуль django-revproxy, который выполняет именно это.
Источник - довольно хороший справочник о том, как достичь того, что вы пытаетесь сделать.
>>> request.headers
{'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6',...}>>>'User-Agent'in request.headers
True>>>'user-agent'in request.headers
True>>> request.headers['User-Agent']Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)>>> request.headers['user-agent']Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)>>> request.headers.get('User-Agent')Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)>>> request.headers.get('user-agent')Mozilla/5.0(Macintosh;IntelMac OS X 10_12_6)
request.META
переменной, которые начинаются с a,HTTP_
и вычеркнув ведущуюHTTP_
часть. Возможно ли это с помощью лямбда-функций? (Я думаю, что они называются лямбда-функциями). Я спрашиваю об этом, потому что, вероятно, я бы продолжил делать это долго, сначала перебирая их, затем проверяя, начинается ли оно с a,HTTP_
а затем добавляю его в новый словарь. Еще раз спасибо.lstrip('HTTP_')
вместо регулярного выражения. :)lstrip
самом деле не будет делать то, что вы просите.lstrip
удалит все ведущие символы, которые соответствуют любым символам в строке, которую вы ей даете, поэтому, если у вас есть заголовок,"HTTP_TOKEN_ID"
он вернется"OKEN_ID"
, потому что"T"
в начале"TOKEN"
совпадает с символом в строке, переданной в lstrip. Способ сделать этоprefix = 'HTTP_'; header = header[len(prefix):]
.HttpRequest.headers
.Начиная с Django 2.2, вы можете использовать
request.headers
для доступа к заголовкам HTTP. Из документации по HttpRequest.headers :Чтобы получить все заголовки, вы можете использовать
request.headers.keys()
илиrequest.headers.items()
.источник
Это еще один способ сделать это, очень похожий на ответ Маноджа Говиндана выше:
Это также захватит
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
.Значения каждого заголовка не должны быть изменены.
источник
re.compile(r'^(HTTP_.+|CONTENT_TYPE|CONTENT_LENGTH)$')
request.META.get ('HTTP_AUTHORIZATION')
/python3.6/site-packages/rest_framework/authentication.py
вы можете получить это из этого файла ...
источник
Я не думаю, что есть простой способ получить только заголовки HTTP. Вам нужно выполнить итерацию request.META dict, чтобы получить все, что вам нужно.
django-debug-toolbar использует тот же подход для отображения информации заголовка. Взгляните на этот файл, отвечающий за получение информации заголовка.
источник
Если вы хотите получить ключ клиента из заголовка запроса, вы можете попробовать следующее:
источник
Как бы то ни было, похоже, вы намерены использовать входящий HTTP-запрос для формирования другого HTTP-запроса. Вроде как шлюз. Есть отличный модуль django-revproxy, который выполняет именно это.
Источник - довольно хороший справочник о том, как достичь того, что вы пытаетесь сделать.
источник
источник
Просто вы можете использовать HttpRequest.headers начиная с Django 2.2 . Следующий пример непосредственно с официального Джанго документации под объекты запроса и ответа секции.
источник