リクエストを使用して外部 URL をロードする django ビューを試すと、「モジュール」オブジェクトに属性「create_connection」がありません。ただし、対話型シェルから urllib2 または同じ要求コードを使用すると、機能します。
私の環境:
- パイソン 2.5.2
- 0.10.0 を要求します (このバージョンを必要とするサードパーティの API を使用しています)
- 私のdjangoサイトのvirtualenv内にWSGIを備えたApache
- ジャンゴ 1.4.1
- デビアン 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 に付属するソケットのバージョンには create_connection メソッドがないようです (2.6 で追加されました)。ただし、virtualenv 内の python インタラクティブ シェルからまったく同じコードを実行しようとしたところ、すべてが機能しました。また、リクエスト 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 つの異なるサードパーティ API を使用しているため、リクエスト以外のものを使用することはお勧めしません。
ありがとう。