Trouble with pycurl.POSTFIELDS
Question
Je connais CURL en PHP, mais je l'utilise pour la première fois en Python avec pycurl.
Je continue à obtenir l'erreur:
Exception Type: error
Exception Value: (2, '')
Je ne sais pas ce que cela pourrait signifier. Voici mon code:
data = {'cmd': '_notify-synch',
'tx': str(request.GET.get('tx')),
'at': paypal_pdt_test
}
post = urllib.urlencode(data)
b = StringIO.StringIO()
ch = pycurl.Curl()
ch.setopt(pycurl.URL, 'https://www.sandbox.paypal.com/cgi-bin/webscr')
ch.setopt(pycurl.POST, 1)
ch.setopt(pycurl.POSTFIELDS, post)
ch.setopt(pycurl.WRITEFUNCTION, b.write)
ch.perform()
ch.close()
L'erreur fait référence à la ch.setopt(pycurl.POSTFIELDS, post)
ligne
La solution
Il semblerait que l'installation de pycurl (ou bibliothèque boucle) est endommagé en quelque sorte. De la documentation des codes d'erreur boucle:
CURLE_FAILED_INIT (2)
Very early initialization code failed. This is likely to be an internal error or problem.
Vous devrez peut-être réinstaller ou recompiler boucle ou pycurl.
Cependant, pour faire une simple requête POST comme vous faites, vous pouvez réellement utiliser « la urllib » de python au lieu de CURL:
import urllib
postdata = urllib.urlencode(data)
resp = urllib.urlopen('https://www.sandbox.paypal.com/cgi-bin/webscr', data=postdata)
# resp is a file-like object, which means you can iterate it,
# or read the whole thing into a string
output = resp.read()
# resp.code returns the HTTP response code
print resp.code # 200
# resp has other useful data, .info() returns a httplib.HTTPMessage
http_message = resp.info()
print http_message['content-length'] # '1536' or the like
print http_message.type # 'text/html' or the like
print http_message.typeheader # 'text/html; charset=UTF-8' or the like
# Make sure to close
resp.close()
pour ouvrir une URL https://
, vous devrez peut-être installer pyopenssl:
http://pypi.python.org/pypi/pyOpenSSL
Certains distibutions comprennent cela, d'autres lui fournir un package supplémentaire comme à travers votre gestionnaire de paquets préféré.
Modifier Avez-vous appelé pycurl.global_init () encore? Je recommande toujours urllib / urllib2 si possible, en tant que votre script sera plus facilement déplacé vers d'autres systèmes.
Autres conseils
Je fais comme ça:
post_params = [
('ASYNCPOST',True),
('PREVIOUSPAGE','yahoo.com'),
('EVENTID',5),
]
resp_data = urllib.urlencode(post_params)
mycurl.setopt(pycurl.POSTFIELDS, resp_data)
mycurl.setopt(pycurl.POST, 1)
...
mycurl.perform()
Je sais que c'est un ancien poste mais je viens de passer ma matinée à essayer de retrouver cette même erreur. Il se trouve qu'il ya un bogue dans pycurl qui était fixés 7.16.2.1 qui a causé setopt () pour briser sur les machines 64 bits.