requests.get方法递归错误问题求助(Python3.8.10环境)
Python 3.8.10下requests.get触发递归错误的解决方法
问题描述
使用Python 3.8.10版本,此前requests.get运行正常,现在调用时出现递归错误,测试代码及完整错误信息如下:
测试代码
x = requests.get('https://w3schools.com', timeout=10) print(x.status_code)
错误信息
File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 1949, in full_dispatch_request rv = self.dispatch_request() File "/usr/local/lib/python3.8/dist-packages/flask/app.py", line 1935, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "/root/api-server/server/rest.py", line 141, in getprice data = General().getprice() File "/usr/local/lib/python3.8/dist-packages/flask_caching/__init__.py", line 795, in decorated_function rv = f(*args, **kwargs) File "/root/api-server/server/methods/general.py", line 41, in getprice result = utils.getprice() File "/root/api-server/server/utils.py", line 180, in getprice x = requests.get('https://api.widecoin.org/info', timeout=10) File "/usr/local/lib/python3.8/dist-packages/requests/api.py", line 76, in get return request('get', url, params=params, **kwargs) File "/usr/local/lib/python3.8/dist-packages/requests/api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python3.8/dist-packages/requests/sessions.py", line 530, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python3.8/dist-packages/requests/sessions.py", line 643, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python3.8/dist-packages/requests/adapters.py", line 439, in send resp = conn.urlopen( File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 665, in urlopen httplib_response = self._make_request( File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 376, in _make_request self._validate_conn(conn) File "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", line 994, in _validate_conn conn.connect() File "/usr/local/lib/python3.8/dist-packages/urllib3/connection.py", line 368, in connect self.ssl_context = create_urllib3_context( File "/usr/local/lib/python3.8/dist-packages/urllib3/util/ssl_.py", line 273, in create_urllib3_context context.options |= options File "/usr/lib/python3.8/ssl.py", line 602, in options super(SSLContext, SSLContext).options.__set__(self, value) File "/usr/lib/python3.8/ssl.py", line 602, in options super(SSLContext, SSLContext).options.__set__(self, value) File "/usr/lib/python3.8/ssl.py", line 602, in options super(SSLContext, SSLContext).options.__set__(self, value) [Previous line repeated 476 more times] RecursionError: maximum recursion depth exceeded
问题原因
该错误是Python标准库ssl.py中SSLContext.options属性的setter方法触发无限递归导致的,通常由以下原因引起:
- urllib3/requests版本与Python 3.8存在兼容性冲突
- Python的ssl模块文件损坏或被第三方库篡改
- 依赖包版本不匹配引发的属性重载异常
解决步骤
1. 升级依赖包到兼容版本
执行以下命令升级requests和urllib3,确保版本与Python 3.8兼容:
pip install --upgrade requests urllib3
2. 验证SSL模块完整性
运行以下代码测试ssl模块是否正常工作:
import ssl ctx = ssl.create_default_context() ctx.options |= ssl.OP_NO_SSLv3 print(ctx.options)
如果这段代码同样触发递归错误,说明Python的ssl模块已损坏,需要重新安装Python 3.8.10。
3. 排查第三方库干扰
检查近期安装的新Python包,尤其是涉及SSL、网络安全类的库,尝试临时卸载这些包后测试requests.get是否恢复正常,定位出干扰源。
4. 自定义SSL适配器绕过自动上下文创建(临时方案)
如果上述方法无效,可以通过自定义HTTP适配器手动创建SSL上下文,避免urllib3的自动逻辑触发递归:
import requests import ssl from urllib3.poolmanager import PoolManager class CustomSSLAdapter(requests.adapters.HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): ctx = ssl.create_default_context() # 生产环境建议保留证书验证,此处为测试示例 ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_context=ctx ) # 使用自定义适配器发送请求 session = requests.Session() session.mount('https://', CustomSSLAdapter()) response = session.get('https://w3schools.com', timeout=10) print(response.status_code)
内容的提问来源于stack exchange,提问作者YUID DAAI
相关产品推荐
相关产品推荐

