2017-01-18 2 views
0

Используя urllib в python 3.6, я создал для него запрос и прикладные заголовки. Тем не менее, Python, похоже, полностью игнорирует эту директиву, и когда я запускаюPython: request.has_header (header) всегда возвращает false

req.has_header('Content-Type') 

результат неверный. Это относится и к другим заголовкам, кроме «Connection». Интересно, что «connection» также возвращает false. Я не смог найти хороший ресурс для того, как точно объявлять заголовки в Python, которые последовательно работают (и Python, по-видимому, очень чувствителен к регистру имен заголовков), поэтому, если у кого-то есть какие-либо рекомендации, мне было бы интересно их услышать !

Мой Актуальной является:

head = { 
    'content-type': 'application/x-www-form-urlencoded', 
    'connection': 'keep-alive', 
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36' 
} 

req = Request(url, post_bytes, head) 
print(req.has_header('content-type') 

Substitute «Content-Type» для любого из других заданных заголовков и результат все равно ложь. Его почти как запрос python по умолчанию не содержит заголовков, но ... неужели это не так?

Спасибо за понимание!

ответ

3

Пробовали ли вы (обратите внимание, что «тип» в нижнем регистре):

req.has_header('Content-type') 

Если вы используете req.header_items(), вы можете увидеть, что ключи заголовка имеют первую букву (и только первая буква) капитализируется.

+0

Это сработало. Я не ожидал, что второе дефисное слово не будет капитализироваться, как первое. В некоторых примерах заголовки с Firebug предположили, что оба слова будут заглавные, но, похоже, это не так для этого приложения. Знаете ли вы, применяется ли чувствительность к регистру при объявлении заголовков? например когда я объявляю head = {'Content-type': ....}? Цените помощь! –

+0

Кажется, заголовки, которые вы объявляете, преобразуются в заголовок с помощью объекта запроса urllib (а не Python). Я не уверен, произойдет ли это до того, как запрос будет отправлен в сети, но я не думаю, что это важно для сервера. –

0

Проверьте это:

urllib2.py

def add_header(self, key, val): 
    # useful for something like authentication 
    self.headers[key.capitalize()] = val 

Теперь, поскольку настройки заголовков такой же, как вызов add_header на каждом из них вы можете увидеть, что происходит, что URLLIB заглавным каждый ключ. Таким образом, ваш заголовок доступен именно под этим ключом: Content-type.

Не спрашивайте меня, почему это делается так. Понятия не имею.

2

Заголовки не не соответствует требованиям к регистру. Заголовки добавляются нормированы капитализированных строк (начальная буква в верхнем регистре, остальные строчные), так что тестирование для Content-type работ:

>>> list(req.headers) 
['Content-type', 'Connection', 'User-agent'] 
>>> req.has_header('Content-type') 
True 

Да, это слишком упрощенно, но достаточно для внутреннего использования заголовков в модуле.

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