Поскольку этот поток немного разветвился в общем обсуждении текущих реализаций с плавающей запятой, я бы добавил, что есть проекты по исправлению их проблем.
Взгляните на https: // posithub.org/, который демонстрирует тип номера, называемый posit (и его предшественник unum), который обещает предложить лучшую точность с меньшим количеством бит. Если мое понимание верное, оно также фиксирует проблемы в вопросе. Весьма интересный проект, человек, стоящий за ним, является математиком Dr. Джон Густафсон . Все это с открытым исходным кодом, с множеством реализаций в C / C ++, Python, Julia и C # ( https://hastlayer.com/arithmetics ).
Согласно документации request.META
, это «стандартный словарь Python, содержащий все доступные HTTP-заголовки». Если вы хотите получить все заголовки, вы можете просто перебирать словарь.
Какая часть вашего кода для этого зависит от вашего точного требования. Любое место, которое имеет доступ к request
, должно делать.
Обновить
Мне нужно получить к нему доступ в классе Middleware, но когда я перебираю его, я получаю много значения за исключением HTTP-заголовков.
blockquote>Из документации:
За исключением
blockquote>CONTENT_LENGTH
иCONTENT_TYPE
, как указано выше, любойHTTP
в запросе преобразуются вMETA
ключи путем преобразования всех символов в верхний регистр, заменяя любые дефисы символами подчеркивания и , добавляя префиксHTTP_
к имени .(добавлено выделение)
Чтобы получить только заголовки
HTTP
, просто отфильтруйте по ключам с префиксомHTTP_
.Обновление 2
Вы могли бы показать мне, как я мог бы создать словарь заголовков, отфильтровывая все ключи из переменной request.META, которые начинаются с HTTP_ и полосы из ведущей части HTTP_.
blockquote>Конечно. Вот один из способов сделать это.
import re regex = re.compile('^HTTP_') dict((regex.sub('', header), value) for (header, value) in request.META.items() if header.startswith('HTTP_'))
Для чего это стоит, кажется, что вы намерены использовать входящий 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 %}
Это еще один способ сделать это, очень похожий на ответ Маноя Говиндана выше:
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
. Значения каждого заголовка должны быть немодифицированы.
request.META.get ('HTTP_AUTHORIZATION') /python3.6/site-packages/rest_framework/authentication.py
вы можете получить это из этого файла, хотя ...
Я не думаю, что есть простой способ получить только HTTP-заголовки. Вы должны перебирать запрос request.META, чтобы получить то, что вам нужно.
django-debug-toolbar использует тот же подход для отображения информации заголовка. Посмотрите на этот файл , ответственный за получение информации заголовка.