Добавление и доступ к заголовкам запроса HTTP POST в python [duplicate]

Поскольку этот поток немного разветвился в общем обсуждении текущих реализаций с плавающей запятой, я бы добавил, что есть проекты по исправлению их проблем.

Взгляните на https: // posithub.org/, который демонстрирует тип номера, называемый posit (и его предшественник unum), который обещает предложить лучшую точность с меньшим количеством бит. Если мое понимание верное, оно также фиксирует проблемы в вопросе. Весьма интересный проект, человек, стоящий за ним, является математиком Dr. Джон Густафсон . Все это с открытым исходным кодом, с множеством реализаций в C / C ++, Python, Julia и C # ( https://hastlayer.com/arithmetics ).

74
задан suci 1 March 2016 в 10:51
поделиться

6 ответов

Согласно документации request.META, это «стандартный словарь Python, содержащий все доступные HTTP-заголовки». Если вы хотите получить все заголовки, вы можете просто перебирать словарь.

Какая часть вашего кода для этого зависит от вашего точного требования. Любое место, которое имеет доступ к request, должно делать.

Обновить

Мне нужно получить к нему доступ в классе Middleware, но когда я перебираю его, я получаю много значения за исключением HTTP-заголовков.

Из документации:

За исключением CONTENT_LENGTH и CONTENT_TYPE, как указано выше, любой HTTP в запросе преобразуются в META ключи путем преобразования всех символов в верхний регистр, заменяя любые дефисы символами подчеркивания и , добавляя префикс HTTP_ к имени .

(добавлено выделение)

Чтобы получить только заголовки HTTP, просто отфильтруйте по ключам с префиксом HTTP_.

Обновление 2

Вы могли бы показать мне, как я мог бы создать словарь заголовков, отфильтровывая все ключи из переменной request.META, которые начинаются с HTTP_ и полосы из ведущей части HTTP_.

Конечно. Вот один из способов сделать это.

import re
regex = re.compile('^HTTP_')
dict((regex.sub('', header), value) for (header, value) 
       in request.META.items() if header.startswith('HTTP_'))
103
ответ дан Manoj Govindan 26 August 2018 в 00:12
поделиться

Для чего это стоит, кажется, что вы намерены использовать входящий HTTP-запрос для формирования другого HTTP-запроса. Похоже на шлюз. Существует отличный модуль django-revproxy , который выполняет именно это.

Источник - довольно хорошая ссылка о том, как выполнить то, что вы пытаетесь сделать.

0
ответ дан abhayAndPoorvisDad 26 August 2018 в 00:12
поделиться
<b>request.META</b><br>
{% for k_meta, v_meta in request.META.items %}
  <code>{{ k_meta }}</code> : {{ v_meta }} <br>
{% endfor %}
0
ответ дан Baum mit Augen 26 August 2018 в 00:12
поделиться

Это еще один способ сделать это, очень похожий на ответ Маноя Говиндана выше:

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. Преобразовать в UPPERCASE.
  3. Prepend HTTP_ ко всем заголовкам в исходном запросе, за исключением CONTENT_TYPE и CONTENT_LENGTH.

Значения каждого заголовка должны быть немодифицированы.

16
ответ дан Dave Gallagher 26 August 2018 в 00:12
поделиться

request.META.get ('HTTP_AUTHORIZATION') /python3.6/site-packages/rest_framework/authentication.py

вы можете получить это из этого файла, хотя ...

3
ответ дан James Vare Samuel 26 August 2018 в 00:12
поделиться

Я не думаю, что есть простой способ получить только HTTP-заголовки. Вы должны перебирать запрос request.META, чтобы получить то, что вам нужно.

django-debug-toolbar использует тот же подход для отображения информации заголовка. Посмотрите на этот файл , ответственный за получение информации заголовка.

4
ответ дан Srikanth Chundi 26 August 2018 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: