Python请求库在Linux下超时

时间:2012-04-17 19:36:56

标签: python python-requests

我正在尝试使用requests.py库来调用其余的Web服务。我在windows下为我的用法编写了一个快速原型,一切正常,但当我试图在linux下运行相同的原型时,我得到一个“requests.exceptions.Timeout:Request timed out”错误。有谁知道为什么会发生这种情况?如果我尝试使用该库访问非https url,它在windows和linux下都能正常工作。

import requests

url = 'https://path.to.rest/svc/?options'
r = requests.get(url, auth=('uid','passwd'), verify=False)
print(r.content)

我注意到如果我从get调用中省略了verify = False参数,我会得到一个不同的异常,即“requests.exceptions.SSLError:无法连接到HTTPS URL,因为SSL模块不可用” 。这似乎是一个可能的潜在原因,虽然我不知道为什么他们会改变错误代码,但我找不到任何ssl模块的引用,我验证了certifi已安装。有趣的是,如果我在Windows中省略了验证参数,我会得到一个不同的异常,“requests.exceptions.SSLError:[Errno 1] _ssl.c:503:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败”

编辑:

提及的所有案例/场景的回溯

如上所示的完整代码:

Traceback(most recent call last):
    File "testRequests.py", line 15, in <module>
        r = requests.get(url, auth=('uid','passwd'), verify=False)
    File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
    File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
    File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 208, in request
    File "build/bdist.linux-x86_64/egg/requests/models.py", line 586, in send
requests.exceptions.Timeout: Request timed out

如上所示的代码减去“verify = False”参数:

Traceback(most recent call last):
    File "testRequests.py", line 15, in <module>
        r = requests.get(url, auth=('uid','passwd'))
    File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
    File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
    File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 208, in request
    File "build/bdist.linux-x86_64/egg/requests/models.py", line 584, in send
requests.exceptions.SSLError: Can't connect to HTTPS URL because the SSL module is not available

上面显示的代码减去“verify = False”参数并在windows下运行:

Traceback(most recent call last):
    File "testRequests.py", line 59, in <module>
        r = requests.get(url, auth=('uid','passwd'))
    File "c:\Python27\lib\site-packages\requests\api.py", line 52, in get
        return request('get', url, **kwargs)
    File "c:\Python27\lib\site-packages\requests\api.py", line 40, in request
        return s.request(method=method, url=url, **kwargs)
    File "c:\Python27\lib\site-packages\requests\sessions.py", line 208, in request
        r.send(prefetch=prefetch)
    File "c:\Python27\lib\site-packages\requests\models.py", line 584, in send
        raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

1 个答案:

答案 0 :(得分:0)

我不是这方面的专家,但看起来服务器的证书无法正确验证。我不知道Python和ssl如何处理证书验证,但第一个选择是尝试忽略该异常,或者可能将https更改为http以尝试查看Web服务是否允许非安全的服务电话。

如果问题围绕ssl的导入错误,则该模块是CPython的一部分,您可能需要确保Python解释器是使用SSL支持编译的(来自openssl)。考虑删除python的包(小心)并使用openssl支持编译它,我个人强烈建议你在删除任何东西之前调查virtualenv,编译Python并不是太困难,它会给你一个更精细的控制你的目标是做。