2010-01-06 15 views
3

Je connais CURL en PHP mais je l'utilise pour la première fois en Python avec pycurl.Problème avec pycurl.POSTFIELDS

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 ligne ch.setopt(pycurl.POSTFIELDS, post)

Répondre

1

Il semblerait que l'installation de pycurl (ou bibliothèque boucle) est endommagé en quelque sorte. A partir des codes d'erreur boucle documentation:

CURLE_FAILED_INIT (2) 
Very early initialization code failed. This is likely to be an internal error or problem. 

Vous aurez besoin éventuellement de 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 » au lieu de CURL python:

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

Certaines distributions incluent ceci, d'autres le fournissent comme un paquet supplémentaire directement à travers votre gestionnaire de paquets favori.


Edit: Avez-vous appelé encore pycurl.global_init()? Je recommande toujours urllib/urllib2 si possible, car votre script sera plus facilement déplacé vers d'autres systèmes.

+0

J'ai également eu des problèmes avec mon ordinateur local en obtenant une erreur sur l'erreur de prise de contact TLS. Je n'utiliserai pas pycurl. Est-ce que l'utilisation d'urllib offre un avantage par rapport à cela (qui fonctionne pour moi): cmd = "curl --url 'https://www.sandbox.paypal.com/cgi-bin/webscr' --data '" + post + "'" \ return os.system (cmd) –

+0

L'avantage d'urllib est que vous n'avez pas besoin de forcer une commande externe, ce qui, surtout dans le cas d'une application web, est une bonne augmentation des performances. En outre, l'appel 'os.system()' varie en fonction de ce qu'il renvoie en fonction du système d'exploitation; Si vous avez migré vers Linux, la valeur de retour peut ne pas être la même. 'urllib' /' urllib2' vous permet également de lire plus facilement la réponse du site. Et enfin, si vous vouliez télécharger votre application sur un hôte qui n'avait pas de curl (ou un Goog le appengine qui ne supporte pas les processus externes), vous devriez utiliser 'urllib' ou similaire. – Crast

3

Je aime que:

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() 
2

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 y avait un bug dans pycurl qui était fixed in 7.16.2.1 qui a provoqué setopt() à casser sur les machines 64 bits.