2012-04-17 81 views
4

我正在尝试使用requests.py库调用其他Web服务。我在windows下为我的用法编写了一个快速原型,并且一切正常,但是当我试图在linux下运行相同的原型时,出现“requests.exceptions.Timeout:Request timed out”错误。有谁知道为什么会发生这种情况?如果我尝试使用该库访问非https网址,它在Windows和Linux下都可以正常工作。Python请求库在Linux下超时

import requests 

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

我也注意到,如果我离开关从get调用验证=假参数,我得到一个不同的异常,即“requests.exceptions.SSLError:无法连接到HTTPS URL,因为SSL模块不可用“。这似乎是一个可能的潜在原因,但我不知道他们为什么会更改错误代码,但我无法找到任何对ssl模块的引用,并且我已验证certifi已安装。有趣的是,如果我在Windows中关闭验证参数,我会得到不同的异常,“requests.exceptions.SSLError:[Errno 1] _ssl.c:503:error: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 

以上代码减去 “验证=假” 放慢参数:

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 

代码如上图减去“验证=假”参数和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 
+0

回溯会很有用。 – 2012-04-17 19:41:55

+0

当你运行'import ssl;从ssl导入套接字'在同一个Python环境中,你得到'requests.exceptions.Timeout:Request timed out'错误? – 2012-04-17 19:45:52

+0

我已经添加了回溯,我的道歉让他们离开。我也尝试了你提到的导入命令并得到一个名为_ssl的ImportError:No模块,但是如果我在Windows环境下运行它,它会导入正常,这看起来是我的问题。对于ssl来说,pypi上的唯一模块就是将python的旧版本的功能赋予2.7版本的应用程序。任何想法为什么它不会导入?我是否需要在服务器上安装ssl(我没有检查过它是否已安装)? – ntlarson 2012-04-17 20:10:09

回答

0

我对此事的专家,但它看起来像来自服务器的证书可以”没有被正确验证。我不知道Python和ssl如何处理证书验证,但第一种选择是尝试忽略异常,或者将https更改为http,以试图查看Web服务是否允许非安全的服务调用。

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

+0

感谢您的输入。服务器不允许我已经提出这个问题的非安全连接,并且证书验证被“verify = False”参数忽略,错误仍然存​​在。 – ntlarson 2012-04-17 20:12:23

+0

你能从Python中的服务器获得任何证书吗? 'import ssl; ssl.get_server_certificate(('google.com',443))'您可以将google.com替换为Web服务主机名。 – lukecampbell 2012-04-17 20:16:27