【问题标题】:Python SSL connection "EOF occurred in violation of protocol"Python SSL 连接“EOF 发生违反协议”
【发布时间】:2013-05-20 21:11:17
【问题描述】:

我正在使用 Django Celery 任务通过使用 Gevent 的请求库连接到 Facebook Graph API。我经常遇到的问题是,我时不时地遇到违反协议异常的 EOF。我四处搜索,各种来源提供了不同的修复,但似乎没有一个有效。

我也尝试过猴子修补 ssl 模块 (gevent.monkey.patch_all()) 和其他一些模块,但没有运气。

我什至不确定这是否是 openssl 问题,因为某些消息来源可能会建议,因为在应用 Gevent 优化之前我没有遇到它

Connection error: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol
Traceback (most recent call last):
File "/home/user/workspace/startup/project/events/tasks.py", line 52, in _process_page
data = requests.get(current_url)
File "/home/user/workspace/startup/env/local/lib/python2.7/site-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/home/user/workspace/startup/env/local/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/home/user/workspace/startup/env/local/lib/python2.7/site-packages/requests/sessions.py", line 354, in request
resp = self.send(prep, **send_kwargs)
File "/home/user/workspace/startup/env/local/lib/python2.7/site-packages/requests/sessions.py", line 460, in send
r = adapter.send(request, **kwargs)
File "/home/user/workspace/startup/env/local/lib/python2.7/site-packages/requests/adapters.py", line 250, in send
raise SSLError(e)
SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol

我使用的是最新的 1.0rc Gevent 版本。

尽管 URL 正确,但不时出现的另一个问题是: 连接被“错误(2,'没有这样的文件或目录')'中断后重试(仍然有 5 次尝试):/ID/events?limit=5000&fields=description,name,location,start_time,end_time&access_token =代币

【问题讨论】:

  • 我也会尝试这个修复。我唯一担心的是,当使用 Gevent Pool size=1 运行任务时,我根本没有收到任何错误,但是当我尝试运行更多(2 到 10)个错误时,错误变得更常见(网络无法访问,EOF ssl 错误,没有这样的文件或目录)。所以对我来说,它似乎是 gevent 问题?
  • 我不知道gevent/requests兼容性的当前状态。你试过grequests吗?
  • TLSv1 强制修复似乎可以解决问题,不再有 SSL 错误。但是......启用此修复后,我不断收到错误 OperationalError:在大约 7k 次写入数据库后无法打开数据库文件(使用 sqllite3)。这很奇怪,因为如果 celery 无法访问 db 而不是在 7k 成功交易之后,这个错误应该从一开始就发生......
  • 奇怪的是,我在使用手机的 wifi/网络共享和 FTPS 时收到此错误,但在使用相同代码和标准 wifi 时却没有。

标签: python django celery python-requests gevent


【解决方案1】:

使用 J.F Sebastian 建议的强制 TLSv1 fix 解决了我面临的所有问题。

未来问题的提示:

  • DNSError 异常 - 将 Gevent 从 0.13.X 升级到 1.0rc 可修复此问题

  • SSL 问题 - 查看 J.F Sebastian 提供的链接中的修复

【讨论】:

    【解决方案2】:

    我安装了最新的 Python 2.7 (2.7.11),问题就消失了。我相信这个问题甚至可以在 2.7.6 中得到解决(我在 Mac OSX 上使用的是 2.7.5)。

    【讨论】:

    【解决方案3】:

    我在为我的机器学习获取推文时遇到了同样的错误。进行以下的 pip install 对我有帮助。这有效:

    pip install ndg-httpsclient
    pip install pyopenssl
    pip install pyasn1
    

    它删除了我的 SSLError: EOF 发生违反协议 (_ssl.c:590) 错误。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2016-03-11
      • 2016-01-29
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多