2016-11-24 2 views
0

Я изучаю Django и создал страницу, которая отображает все HTTP-заголовки в запросе, используя словарь request.META. Я запускаю его локально, и он показывает мне странное количество заголовков, таких как «TEMP», содержащие путь к моей временной папке Windows или «PATH» с моими параметрами полного пути и гораздо больше информации, которую я действительно не нахожу необходимо предоставить доступ к моим запросам браузера (например, к установленным приложениям). Нормально ли это? Что мне с этим делать?Список заголовков HTTP

ответ

1

Итак, давайте быстро перейти в исходный код Джанго:

Джанго/ядра/обработчиков/wsgi.py

class WSGIRequest(http.HttpRequest): 
    def __init__(self, environ): 
     ... 
     self.META = environ 
     self.META['PATH_INFO'] = path_info 
     self.META['SCRIPT_NAME'] = script_name 
     ... 

Этот обработчик используется по умолчанию в runserver команды и любой другой сервер WSGI , Словарь environ поставляется с базового веб-сервера. И он заполнен множеством данных. Вы можете прочитать больше о environ словаря здесь в официальных WSGI документы:

https://www.python.org/dev/peps/pep-0333/#environ-variables

отметить также, что любой веб-сервер бесплатно добавить свои собственные переменные environ. Я предполагаю, что именно поэтому вы видите такие вещи, как TEMP. Вероятно, они используются внутри веб-сервера.

Если вы хотите получить только заголовки, то wsgi обязывает, что заголовки должны начинаться с префикса HTTP_, за исключением CONTENT_TYPE и CONTENT_LENGTH.

Документы Django вводят в заблуждение. Поле META содержит больше, чем только заголовки. Это не является ни правильным, ни неправильным, так оно и есть. Особое внимание следует уделять при работе с META. Утечка некоторых данных может быть серьезной проблемой безопасности.

+0

Спасибо, причудливый. Тогда, я полагаю, только те, которые начинаются с «HTTP», фактически отправляются агентом пользователя на сервер. Я изменил свой код, чтобы разобраться во всем остальном, и теперь заголовки, которые я получаю, наконец похожи на то, что я привык видеть. –

+0

@ RayP. Да, за исключением заголовков 'CONTENT_LENGTH' и' CONTENT_TYPE' (непоследовательных, я знаю). Другими вещами, которые отправляются клиентам, являются 'REQUEST_METHOD',' PATH_INFO', 'QUERY_STRING' и' SERVER_PROTOCOL' (да, это вводит в заблуждение, его следует называть 'REQUEST_PROTOCOL'). Некоторые из них, вероятно, доступны через различные механизмы Django. Я думаю, что это полный список информации заголовка. – freakish

Смежные вопросы