Requests: https: // لا يعمل مع Python 3.6

تم إنشاؤها على ٧ ديسمبر ٢٠١٦  ·  16تعليقات  ·  مصدر: psf/requests

عند طلب عنوان URL https: // ، يقع الأسلوب 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 و monkey لأنه يقوم باكتشاف الميزات في الوحدة النمطية المحددة في وقت الاستيراد. سيعمل الإصدار المستقبلي على تحديثه مع 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]>

حسنًا ، يبدو هذا الآن وكأنه حالة "لا يمكن إعادة عرضه". قد يكون من المفيد النظر في التثبيت الخاص بك juokaz ، يبدو أنه يسيء التصرف قليلاً.

بعد مزيد من التصحيح ، تمكنت من إعادة إنتاجه باعتباره مشكلة 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.

تبدو المكالمة الفائقة () غريبة ولكنها صحيحة. إنها الطريقة العامة لجلب واصف السمة للفئة الأصل. إنه شر ضروري لتغيير خاصية في فئة فرعية. اطلب من Google "خاصية الفئة الفرعية لـ David Beazley" وستظهر لك نفس الشيء ، 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 من فضلك لا تستخدم هذه المشكلة أو متعقب هذا المشروع لمناقشة المشاكل الموجودة.

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 و monkey لأنه يقوم باكتشاف الميزات في الوحدة النمطية المحددة في وقت الاستيراد. سيعمل الإصدار المستقبلي على تحديثه مع urllib3 الأحدث الذي يحتوي على إصلاحات لهذه المشكلة ، ولكن في هذه الأثناء ، يجب تطبيق تصحيح القرد الخاص بـ gevent قبل استيراد الطلبات.

Lukasa هل تشير إلى هذا الإصدار ؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات