0

私は Django Web サイトを作成していますが、かなり新しいものです。この webapp では、データベースから要求されたデータを含む xml ファイルを吐き出すこの API を使用する必要があります。基本的に API URL は次のとおりです。

https://adminuser:password@url.to.database.com/database.getdata?arg=1&arg2=0

したがって、私の python views.py には次のものがあります。

def fetch_xml(url):
  import urllib
  import xml.etree.cElementTree as xml_parser

  u = urllib.URLopener(None)
  usock = u.open(url)
  rawdata = usock.read()
  usock.close()
  return xml_parser.fromstring(rawdata)

http://www.webmonkey.com/2010/02/integrate_web_apis_into_your_django_site/から取得したもの

ただし、次のエラーがすぐに表示されましたusock = u.open(url)

IOError at /webapp/

[Errno socket error] [Errno 1] _ssl.c:480: error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac

urllib接続が確立できない場合、IOError がスロー されるというドキュメントを読みました。http://docs.python.org/library/urllib.html また、ウィキペディアでは、「Bad record MAC」という致命的なアラートは、「SSL 実装が不適切であるか、ペイロードが改ざんされている可能性があります。例: FTPS サーバーの FTP ファイアウォール ルール」を意味します。 ."

しかし、私が理解していないのは、URL をブラウザーに貼り付けると正常に動作し、XML ファイルが吐き出されるということです。

また、(ロングショットとして)Apacheのインストールである可能性があると考えたのでapachectl -t -D DUMP_MODULES、端末に入力してmod_sslがロードされていることを確認し、共有としてロードされました。

どんなアイデアでも大歓迎です。ありがとう!

4

1 に答える 1

1

同僚が PHP で動作する API を取得したので、彼のコードを調べたところ、彼はcURL. と呼ばれるpythonバージョンがあることがわかりましたPycURL。PycURL をインストールした後、urllibコードを切り取って、代わりに PycURL を使用しました。

import pycurl

c = pycurl.Curl()
c.setopt(pycurl.URL, authenticate_url)
c.setopt(pycurl.SSLVERSION, 3)
c.setopt(pycurl.SSL_VERIFYPEER, False)
c.setopt(pycurl.SSL_VERIFYHOST, 2)
c.setopt(pycurl.USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)')

outputXML = c.perform()
c.close()

urllibPycURL ほど堅牢ではないと思います。

于 2010-06-29T15:29:00.263 に答える