Как перевести URL-запросы с помощью pycurl в python-запросы?

Я хотел бы изменить следующий код для запуска модуля «запросы». У меня есть следующий код, который работает на веб-сайте:

def post(url, message, key, sign):

    curl = pycurl.Curl()
    curl.setopt(pycurl.URL, url)
    curl.setopt(pycurl.SSL_VERIFYPEER, 0)
    curl.setopt(pycurl.SSL_VERIFYHOST, 0)
    buf = cStringIO.StringIO()
    curl.setopt(pycurl.WRITEFUNCTION, buf.write)
    curl.setopt(pycurl.POSTFIELDS, message)
    curl.setopt(pycurl.HTTPHEADER, ['Key:' + key,
                                'Sign:' + (sign)])
    curl.perform()
    response = buf.getvalue()
    buf.close()
    return response        

Я попытался получить доступ к веб-сайту с запросами и получил отказ из-за недопустимых значений запроса, используя следующий код:

def post(url, message, key, sign):
    import requests
    session = requests.session()
    session.headers = {'Key': key, 'Sign': sign}
    response = session.post(url, message)
    return response

Что я делаю неправильно, что эти методы не ведут себя одинаково?

Спасибо.


person roeiba    schedule 17.01.2014    source источник
comment
Вы должны добавить свою трассировку. Если это связано с сертификатом ssl, попробуйте с session.post(url, message, verify=False)   -  person gawel    schedule 18.01.2014
comment
У меня нет трассировки, так как нет сбоя Python. Ошибка возвращается с сайта...   -  person roeiba    schedule 19.01.2014


Ответы (1)


Использование Pycurl:

POST /post HTTP/1.1
User-Agent: PycURL/7.32.0
Host: 127.0.0.1:4000
Accept: */*
Key:key
Sign:sign
Content-Length: 3
Content-Type: application/x-www-form-urlencoded

foo

С запросами:

POST /post HTTP/1.1
Host: 127.0.0.1:4000
Accept-Encoding: identity
Content-Length: 3
Key: key
Sign: sign

foo

Есть несколько отличий, которые могут привести к вашей ошибке:

  • Отсутствуют заголовки User-Agent и Accept. Это связано с тем, что вы перезаписываете атрибут session.headers, содержащий эти заголовки по умолчанию. Попробуйте это вместо этого:

    session.headers.update({'Key': key, 'Sign': sign})

  • Отсутствует заголовок Content-Type. Я думаю, вы передали строку в качестве параметра message. Requests не знает, что это application/x-www-form-urlencoded, и поэтому не устанавливает соответствующий заголовок. Либо:

    • Set the header yourself
    • Лучше: pass запрашивает словарь ваших параметров. Они будут закодированы и объявлены правильно
person t-8ch    schedule 19.01.2014