Беда с pycurl.POSTFIELDS - PullRequest
       65

Беда с pycurl.POSTFIELDS

3 голосов
/ 07 января 2010

Я знаком с CURL в PHP, но впервые использую его в Python с pycurl.

Я получаю сообщение об ошибке:

Exception Type:     error
Exception Value:    (2, '')

Понятия не имею, что это может значить. Вот мой код:

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

Ошибка относится к строке ch.setopt(pycurl.POSTFIELDS, post)

Ответы [ 3 ]

3 голосов
/ 21 апреля 2010

Мне так нравится:

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 голосов
/ 02 июня 2011

Я знаю, что это старый пост, но я только что провел свое утро, пытаясь отследить эту же ошибку. Оказывается, в pycurl есть ошибка, которая была исправлена ​​в 7.16.2.1 , из-за которой setopt () ломался на 64-битных машинах.

1 голос
/ 07 января 2010

Может показаться, что ваша установка pycurl (или библиотека curl) как-то повреждена. Из документации кодов ошибок curl:

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

Возможно, вам потребуется переустановить или перекомпилировать curl или pycurl.

Однако, чтобы сделать простой POST-запрос, как вы делаете, вы можете использовать pyll "urllib" вместо 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()

, чтобы открыть https:// URL, вам может потребоваться установить PyOpenSSL: http://pypi.python.org/pypi/pyOpenSSL

Некоторые дистрибутивы включают это, другие предоставляют его как дополнительный пакет прямо через ваш любимый менеджер пакетов.


Редактировать: Вы уже позвонили pycurl.global_init () еще? Я по-прежнему рекомендую urllib / urllib2, где это возможно, так как ваш скрипт будет легче переносить в другие системы.

...