2010-06-28 1 views
0

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

https://adminuser:[email protected]/database.getdata?arg=1&arg2=0

Так что в моем питона 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

Моя коллега получила 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.