XML-файл запроса Django с ошибкой ввода-вывода SSL - PullRequest
0 голосов
/ 28 июня 2010

Я делаю сайт Django, и я довольно новый.В этом веб-приложении мне нужно использовать этот API, который будет выдавать XML-файл с запрошенными данными из базы данных.В основном URL API:

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 Кроме того, в Википедии фатальное предупреждение «Плохая запись MAC» означает «Возможно, неправильная реализация SSL, или полезные данные были подделаны. Например, правило брандмауэра FTP на сервере FTPS».Чего я не понимаю, так это того, что когда я вставляю URL в браузер, он работает нормально и выплевывает XML-файл.

Я также подумал (в общем), что это может быть моя установка Apache, поэтому я проверилэтот mod_ssl загружался, набирая apachectl -t -D DUMP_MODULES в терминале, и он загружается как общий.

Любые идеи будут с благодарностью.Спасибо!

1 Ответ

1 голос
/ 29 июня 2010

Мой коллега получил API для работы на PHP, поэтому я взглянул на его код, и он использовал 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()

Я думаю, urllib не так надежен, как PycURL.

...