Requests: Запросы 2.11: ошибка check_header_validity для заголовка с целочисленным значением

Созданный на 8 авг. 2016  ·  23Комментарии  ·  Источник: psf/requests

Привет,

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

2.10:

In [1]: import requests

In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
Out[2]: <Response [200]>

2.11

In [1]: import requests

In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
    751     try:
--> 752         if not pat.match(value):
    753             raise InvalidHeader("Invalid return character or leading space in header: %s" % name)

TypeError: expected string or bytes-like object

During handling of the above exception, another exception occurred:

InvalidHeader                             Traceback (most recent call last)
<ipython-input-2-ae7ec2933e34> in <module>()
----> 1 requests.get('http://bing.com', headers={'Content-Length': 42})

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in get(url, params, **kwargs)
     68
     69     kwargs.setdefault('allow_redirects', True)
---> 70     return request('get', url, params=params, **kwargs)
     71
     72

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in request(method, url, **kwargs)
     54     # cases, and look like a memory leak in others.
     55     with sessions.Session() as session:
---> 56         return session.request(method=method, url=url, **kwargs)
     57
     58

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    455             hooks = hooks,
    456         )
--> 457         prep = self.prepare_request(req)
    458
    459         proxies = proxies or {}

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in prepare_request(self, request)
    388             auth=merge_setting(auth, self.auth),
    389             cookies=merged_cookies,
--> 390             hooks=merge_hooks(request.hooks, self.hooks),
    391         )
    392         return p

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare(self, method, url, headers, files, data, params, auth, cookies, hooks, json)
    293         self.prepare_method(method)
    294         self.prepare_url(url, params)
--> 295         self.prepare_headers(headers)
    296         self.prepare_cookies(cookies)
    297         self.prepare_body(data, files, json)

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare_headers(self, headers)
    407             for header in headers.items():
    408                 # Raise exception on invalid header value.
--> 409                 check_header_validity(header)
    410                 name, value = header
    411                 self.headers[to_native_string(name)] = value

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
    754     except TypeError:
    755         raise InvalidHeader("Header value %s must be of type str or bytes, "
--> 756                             "not %s" % (value, type(value)))
    757
    758

InvalidHeader: Header value 42 must be of type str or bytes, not <class 'int'>

Мы определяем Content-Length в каждом запросе. В любом случае, использование целого числа для заголовка, который семантически является целым числом, не имеет смысла?

Самый полезный комментарий

Похоже на критическое изменение для дот-релиза, не так ли?

Все 23 Комментарий

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

TL; DR этого: да, это было сделано специально, и нет, мы не думаем, что это ошибка.

См. Также: # 865.

Похоже на критическое изменение для дот-релиза, не так ли?

И вы не описали эту огромную модификацию в журнале изменений :(

Это не критическое изменение API - API четко задокументирован как основанный на строках во всей документации. Тот факт, что вы использовали его с целыми числами вместо предполагаемого ввода, является ошибкой в ​​вашем коде, а не в этой кодовой базе или изменении API.

Хорошей идеей может быть добавление в журнал изменений об этом неизменном изменении.

@ clarkbreyman-yammer Для ясности, это немного пограничный случай. Вы можете увидеть недавнее принятие решения в # 3386 и # 3388, но основной аргумент таков: нестроковые заголовки никогда не _намышлялись_ на работу, поэтому тот факт, что они перестали работать, является приемлемым. Фактически, это раньше не работало.

@lmazuel Вы правы, что это было пропущено из

И чтобы было ясно, все мы трое согласны по этому поводу. Тот факт, что отправка целого числа там _ever_ сработал, был чистой воды удачей. Раньше это вообще не работало, и мы решили, что это никогда не должно работать давно. Но у нас никогда не было ничего, что бы заставляло это делать.

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

Добавил примечание в журнал изменений.

Спасибо @kennethreitz.

Хорошо, спасибо за разъяснения. Я обновлю свой код соответственно.
@kennethreitz, если бы вы могли добавить свою заметку и в PyPI, было бы замечательно.

@lmazuel на нем!

@lmazuel готово ✨🍰✨

@lmazuel ps спасибо за заботу: P

Я исправил свой код, все остальное работает отлично. Спасибо за сверхбыстрый отклик!

в официальных документах нет упоминания о серьезном изменении. Это действительно заблуждение.

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

Привет, @COLDMOUNT , вы можете найти документацию здесь, в последнем абзаце раздела быстрого запуска для пользовательских заголовков. Мы также опубликовали изменение в HISTORY.rst для 2.11.0, которое представляет собой журнал изменений запросов.

Лучше предложить пример заголовков в типе str, или как
переводим заголовки из типа dict в тип str, спасибо.

2016-09-27 1:30 GMT + 08:00 Nate Prewitt [email protected] :

Привет, @COLDMOUNT https://github.com/COLDMOUNT , вы можете найти
документация здесь
http://docs.python-requests.org/en/master/user/quickstart/#custom -headers
в последнем абзаце раздела быстрого запуска для настраиваемых заголовков. Мы
также опубликовал изменение в (HISTORY.rst) [ https: // github.
com / kennethreitz / requests / blob / master / HISTORY.rst] для версии 2.11.0, которая является
Журнал изменений запросов.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249638650,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ARIa89wU7tKL8Br2WWU6lJy8HEbNr72Vks5quAE3gaJpZM4JffFG
.

или как перевести заголовки в типе dict в тип str

Чего ждать? Как вы раньше отправляли заголовки?

Так же, как руководство на странице -
http://docs.python-requests.org/en/master/user/quickstart/ - «Если бы вы
хотите добавить HTTP-заголовки в запрос, просто передайте dict в заголовки
параметр. "Но теперь тип dict больше не принимается, и что делает str
типа похожи?

2016-09-27 17:51 GMT + 08: 00 Кори Бенфилд [email protected] :

или как перевести заголовки в типе dict в тип str

Чего ждать? Как вы раньше отправляли заголовки?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249819028,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ARIa8_ZPJmzxH2lWmpTvSJ3PvHE7jlpvks5quOcrgaJpZM4JffFG
.

@COLDMOUNT dict _абсолютно_ принято, мы его вообще не меняли. Мы изменили то, что ключи и значения этого словаря теперь должны быть строками. Раньше это могло быть несколько других типов случайно, что теперь решено. Документацию менять не нужно.

Понятно, круто! Спасибо! :)

2016-09-27 18:23 GMT + 08: 00 Кори Бенфилд [email protected] :

@COLDMOUNT https://github.com/COLDMOUNT dict _абсолютно_ принят,
мы это совсем не изменили. Что мы изменили, так это то, что ключи и
значения этого словаря теперь должны быть строками. Раньше это было возможно
они случайно оказались в нескольких других типах, что теперь решено. В
документацию менять не нужно.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249825918,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ARIa8z0jZ-ovBtvFWl4hTXnkk_kJXobrks5quO6ggaJpZM4JffFG
.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги