Requests: https: // не работает с Python 3.6

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

При запросе https: // url метод request попадает в бесконечную рекурсию.

Проблема в этом методе в python/ssl.py .

    @options.setter
    def options(self, value):
        super(SSLContext, SSLContext).options.__set__(self, value)

Коммит, который представил эту строку в Python, - это https://hg.python.org/cpython/rev/c32e9f9b00f7.

Фактическая ошибка выглядит так:

  File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 501, in get
    return self.request('GET', url, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen
    chunked=chunked)
  File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 350, in _make_request
    self._validate_conn(conn)
  File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 835, in _validate_conn
    conn.connect()
  File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 311, in connect
    cert_reqs=resolve_cert_reqs(self.cert_reqs),
  File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 264, in create_urllib3_context
    context.options |= options
  File "/usr/local/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/local/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/local/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 316 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

Протестировано с использованием python 3.6.0b4 .

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

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

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

На самом деле это похоже на ошибку в стандартной библиотеке: похоже, что они ввели бесконечную рекурсию при непосредственной настройке параметров. @tiran?

Я не могу воспроизвести проблему на своем компьютере (Python из последней ветки hg 3.6)

$ ./python 
Python 3.6.0+ (3.6:c4f39b6f3176, Dec  7 2016, 21:55:50) 
[GCC 6.2.1 20160916 (Red Hat 6.2.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ctx = ssl.SSLContext(ssl.PROTOCOL_TLS)
>>> ctx.options |= 5
>>> class MySSLContext(ssl.SSLContext):
...     pass
... 
>>> ctx = MySSLContext(ssl.PROTOCOL_TLS)
>>> ctx.options |= 5

Я только что попытался воспроизвести это с конца запросов; Не могу попасть на 3.6.0b4 или 3.6.0rc1:

$ python
Python 3.6.0b4 (v3.6.0b4:18496abdb3d5, Nov 21 2016, 20:44:47)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.get('https://github.com/kennethreitz/requests/issues/3752')
<Response [200]>
$ python
Python 3.6.0rc1 (v3.6.0rc1:29a273eee9a5, Dec  6 2016, 16:24:13)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.get('https://github.com/kennethreitz/requests/issues/3752')
<Response [200]>

Может ли это быть что-то конкретное для платформы или URL-адреса?

(OS X 10.12.1, 16B2659, с моей стороны)

Запросы также работают с Python 3.6.0 из hg:

$ ./python -m venv venv
$ venv/bin/pip install requests
Collecting requests
  Using cached requests-2.12.3-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.12.3
$ venv/bin/python
Python 3.6.0+ (3.6:c4f39b6f3176, Dec  7 2016, 21:55:50) 
[GCC 6.2.1 20160916 (Red Hat 6.2.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.get('https://www.python.org')
<Response [200]>

Хорошо, сейчас это похоже на ситуацию "не могу воспроизвести". Возможно , стоит взглянуть на вашу установку

После дальнейшей отладки я смог воспроизвести это как проблему gevent (в этом контексте я использовал это).

Полагаю, мне придется отнести его народу gevent, чтобы они посмотрели? Спасибо, что изучили это, всем.

root<strong i="8">@8042e3f57981</strong>:/app# python
Python 3.6.0b4 (default, Nov 23 2016, 21:34:29)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import gevent.monkey
>>> gevent.monkey.patch_all()
>>>
>>> from requests.packages.urllib3.util.ssl_ import create_urllib3_context
>>> create_urllib3_context()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 268, in create_urllib3_context
    context.options |= options
  File "/usr/local/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/local/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/usr/local/lib/python3.6/ssl.py", line 459, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 329 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object
>>>

Ага, это проблема gevent. Я предполагаю, что gevent еще не работает с Python 3.6.

Вызов super () выглядит странно, но это правильно. Это общий способ получить дескриптор атрибута родительского класса. Изменение свойства в подклассе - неизбежное зло. Спросите у Google «свойство подкласса Дэвида Бизли», и он покажет вам то же самое, https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch08s08.html

>>> from ssl import SSLContext
>>> super(SSLContext, SSLContext).options
<attribute 'options' of '_ssl._SSLContext' objects>
>>> import _ssl
>>> super(SSLContext, SSLContext).options is _ssl._SSLContext.options
True

Вызов super(SSLContext, SSLContext).options.__set__(self, value) аналогичен настройке параметров экземпляра родительского класса.

Вот ссылка на билет gevent для той же проблемы: https://github.com/gevent/gevent/issues/903
Gevent теперь по умолчанию увеличен до> 1,2. Если у вас все еще есть эта проблема, ее можно исправить с помощью простого pip install --upgrade gevent .

@pirate , который не

@AeroNotix, пожалуйста, не используйте этот выпуск или трекер этого проекта для обсуждения проблем gevent.

@pirate, тогда можешь ли ты разблокировать этот билет? У меня все еще та же проблема на python 3.6 с обновленными версиями всего.

Нет, @AeroNotix , я не участвую ни в одном из проектов, возможно, вы можете отправить электронное письмо / IRC одному из участников другой ветки напрямую?

@pirata Эта проблема все еще существует с python 3.6.1 , gevent 1.2.1 , requests 2.13.0 . Действия по воспроизведению:

import requests
import gevent.monkey
gevent.monkey.patch_ssl()
requests.get("https://google.com")

Если я импортирую requests после патча, все работает. Раньше было так, что это не имеет значения, и мне интересно, можно ли что-то изменить, чтобы сохранить старое поведение. Что ты думаешь, @Lukasa ?

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

@Lukasa , вы имеете в виду этот релиз ?

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

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

xsren picture xsren  ·  3Комментарии

eromoe picture eromoe  ·  3Комментарии

iLaus picture iLaus  ·  3Комментарии

remram44 picture remram44  ·  4Комментарии

ReimarBauer picture ReimarBauer  ·  4Комментарии