首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSLError请求失败,“未能分配SSL上下文”

SSLError请求失败,“未能分配SSL上下文”
EN

Stack Overflow用户
提问于 2018-03-06 22:43:32
回答 1查看 1K关注 0票数 1

我试图使用请求向RESTful API发出POST请求。我的代码非常简单:

代码语言:javascript
复制
import json
import requests
import subprocess

url = 'https://api.host.name?key=MY_API_KEY'
post_data = {'parameter': 'value'}
try:
    requests.post(url, json = post_data, verify=False) # Fails Frequently ...
except requests.exceptions.SSLError:
    post_data_str = json.dumps(post_data)
    curl_cli = "curl -H \"Content-Type: application/json\" -H \"Accept: application/json\" -X POST -d '%s' %s" %(post_data_str, url)
    output = subprocess.check_output(curl_cli , shell=True) # Works every time!

代码有时可以工作,但最典型的情况是,它失败时会出错:

requests.exceptions.SSLError: HTTPSConnectionPool(host=' api.host.name ',port=443 ):最大重试超过url: api.host.name(由SSLError引起(SSLError(‘未能分配SSL上下文’))

这个错误似乎是随机的,有时在我第一次运行代码时就失败了,有时是在几个成功的请求之后。当我从Postman (一个向REST发出请求的应用程序)执行相同的请求时,它总是成功的。

我的requests版本是2.18.4,我在Ubuntu16.04.3LTS上使用Python2.7.12

编辑:

我还用类似的结果尝试了urllib2。守则是:

代码语言:javascript
复制
import json
import urllib2

url = 'https://api.host.name?key=MY_API_KEY'
post_dict = {'parameter': 'value'}
post_data = json.dumps(post_dict)
clen = len(post_data)
req = urllib2.Request(url, post_data, {'Content-Type': 'application/json', 'Content-Length': clen})
f = urllib2.urlopen(req)
response = f.read()

错误本质上是相同的:

代码语言:javascript
复制
 File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 429, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 447, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1241, in https_open
    context=self._context)
  File "/usr/lib/python2.7/urllib2.py", line 1167, in do_open
    h = http_class(host, timeout=req.timeout, **http_conn_args)
  File "/usr/lib/python2.7/httplib.py", line 1262, in __init__
    context = ssl._create_default_https_context()
  File "/usr/lib/python2.7/ssl.py", line 411, in create_default_context
    context = SSLContext(PROTOCOL_SSLv23)
  File "/usr/lib/python2.7/ssl.py", line 337, in __new__
    self = _SSLContext.__new__(cls, protocol)
ssl.SSLError: ('failed to allocate SSL context',)
EN

回答 1

Stack Overflow用户

发布于 2018-03-07 00:41:28

在没有更多信息的情况下,我能提供的是:

  1. 如果你不是像我听说的人们从2.7(可能不是你的解决方案)得到这样的问题,试着使用python3。
  2. 尝试实现一个睡眠函数(导入睡眠),并让它在请求之间等待一个超时,因为您可能在分配的时间内请求了太多的API调用,并且系统可能会“禁止”您的机器访问API。
  3. 验证OpenSSL库版本并在必要时进行更新。

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49141273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档