当我尝试使用请求加载外部 URL 的 django 视图时,我得到一个“模块”对象没有属性“create_connection”。但是,当我使用 urllib2 或来自交互式 shell 的相同请求代码时,它可以工作。
我的环境:
- Python 2.5.2
- 请求 0.10.0(我正在使用需要此版本的 3rd 方 api)
- 在我的 django 站点的 virtualenv 中带有 WSGI 的 Apache
- Django 1.4.1
- Debian Linux 5
- 我没有 SELinux(或任何类似的安全性)
我实际上为完全不同的功能使用了 2 个不同的 API。他们都需要请求,他们都给出了这个错误:
Exception Type: AttributeError
Exception Value: 'module' object has no attribute 'create_connection'
Exception Location: /my/virtualenv/dir/lib/python2.5/site-packages/requests/packages/urllib3/connectionpool.py in connect, line 67
异常中提到的行是:
sock = socket.create_connection((self.host, self.port), self.timeout)
看起来python 2.5附带的socket版本没有create_connection方法(它是在2.6中添加的)。但是,我尝试从 virtualenv 中的 python 交互式 shell 运行完全相同的代码,一切正常。此外,请求 0.10.0 应该适用于 python 2.5。
我创建了以下 2 个测试视图,因为我怀疑请求是问题的一部分:
def get_requests(request):
import requests
r = requests.get("https://google.ca")
return HttpResponse(r.text)
def get_urllib(request):
import urllib2
r = urllib2.urlopen('https://google.ca')
return HttpResponse(r.read())
urllib 视图有效,请求视图给了我与上面相同的错误。
urllib 工作的事实向我表明 Apache 有权连接到互联网(这不是防火墙问题)。
在尝试视图时,我已经完成了 tcpdump,并且请求甚至从未尝试连接。
有任何想法吗?请不要建议使用请求以外的东西,因为我正在使用 2 个需要它的不同的 3rd 方 API。
谢谢。