使用Python“requests”库的HTTPS POST请求上出现不一致的IOError异常

2024-04-19 21:50:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在尝试使用requests进行HTTPS发布时,我经常遇到以下异常

这个问题偶尔会发生,并且在重试时(使用backoff模块)成功地通过了相同的请求。我不知道如何重现这一点,但当我运行大量HTTPS POST请求时,我可以看到这个问题。你知道吗

Traceback (most recent call last):
 File \"/usr/local/lib/python2.7/dist-packages/shared/util/http_util.py\", line 71, in send_https_post_request
 response = session.post(url, cert=cert, data=data)
 File \"/usr/local/lib/python2.7/dist-packages/requests/sessions.py\", line 522, in post
 return self.request('POST', url, data=data, json=json, **kwargs)
 File \"/usr/local/lib/python2.7/dist-packages/requests/sessions.py\", line 475, in request
 resp = self.send(prep, **send_kwargs)
 File \"/usr/local/lib/python2.7/dist-packages/requests/sessions.py\", line 596, in send
 r = adapter.send(request, **kwargs)
 File \"/usr/local/lib/python2.7/dist-packages/requests/adapters.py\", line 423, in send
 timeout=timeout
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py\", line 595, in urlopen
 chunked=chunked)
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py\", line 352, in _make_request
 self._validate_conn(conn)
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py\", line 831, in _validate_conn
 conn.connect()
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connection.py\", line 289, in connect
 ssl_version=resolved_ssl_version)
 File \"/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py\", line 306, in ssl_wrap_socket
 context.load_cert_chain(certfile, keyfile)
IOError: [Errno 2] No such file or directory

相关代码:

@contextlib.contextmanager
def pem_bytes_as_cert_file(pem_cert_bytes):
    '''
     Given bytes, return a temporary file which can be used as the cert
    '''
    with tempfile.NamedTemporaryFile(delete=True, suffix='.pem') as t_pem:
        f_pem = open(t_pem.name, 'wb')
        f_pem.write(pem_cert_bytes)
        f_pem.close()
        yield t_pem.name

def send_https_post_request(session, url, data, pem_cert_in_bytes):
    with pem_bytes_as_cert_file(pem_cert_in_bytes) as cert:
        response = session.post(url, cert=cert, data=data)
        response.raise_for_status()
        response.close()

你能帮我进一步了解这个问题吗?你知道吗


Tags: inpysenddatacertbyteslibpackages
1条回答
网友
1楼 · 发布于 2024-04-19 21:50:11
... context.load_cert_chain(certfile, keyfile)
IOError: [Errno 2] No such file or directory

上下文显然是在加载证书和密钥

with pem_bytes_as_cert_file(pem_cert_in_bytes) as cert:
    response = session.post(url, cert=cert, data=data)

您似乎将证书和密钥作为字符串,并尝试创建一个临时文件,将其作为cert参数

with tempfile.NamedTemporaryFile(delete=True, suffix='.pem') as t_pem:
    f_pem = open(t_pem.name, 'wb')
    f_pem.write(pem_cert_bytes)
    f_pem.close()
    yield t_pem.name

使用tempfile.NamedTemporaryFile创建一个临时文件,并将cert+key字符串写入其中。然后关闭临时文件。documentation for NamedTemporaryFile表示:

If delete is true (the default), the file is deleted as soon as it is closed.

因此,文件一关闭就被删除。只有在幸运的情况下(竞赛条件),当您尝试从session.post内部使用文件时,该文件仍然可以在系统中访问。你知道吗

相关问题 更多 >