Модуль запросов Python и ответы JSON

Я использую замечательный модуль запросов для тестирования API, который я создал для одного наших внутренних проектов. Я считаю, что обнаружил недостаток либо в самом модуле «Запросы», либо в моем использовании его.

Поскольку наши данные не являются сверхчувствительными, наш API использует простую базовую HTTP-аутентификацию для управления доступом. Когда я делаю запросы URL-адреса API, используя JSON в качестве формата данных и либо urllib2 с HTTPBasicAuthHandler, либо PHP и cURL, я возвращаю свои данные в виде правильно отформатированной строки JSON - без проблем.

Однако, когда я делаю тот же запрос с помощью модуля «Запросы», я получаю закодированную строку и не могу определить, какой это тип кодировки. Вот фрагмент начала этой строки:

\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xadZ\xfb\x8f\xd3H\x12\xfeWzG\xab;\x90

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

import requests
# api_user and api_pw not printed here for security reasons
r = requests.get('http://ourdomain.com/api/featured/school/json', auth=(api_user, api_pw))
status = r.status_code # Produces 200 every time
rawdata = r.read()
print rawdata

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

Может ли кто-нибудь помочь мне определить: а) что это за кодировка (для моего собственного назидания) и б) почему запросы возвращают данные в этой кодировке и как ее декодировать и/или «исправить».

Заранее спасибо!


person tommytwoeyes    schedule 09.08.2011    source источник


Ответы (1)


Из любопытства, что вы получаете, когда print r.content ?

person Hank Gay    schedule 09.08.2011
comment
Это интересно! Я даже не видел этот метод, когда видел: dir(r) Выводит строку JSON. Это тот метод, который следует вызывать вместо read()? - person tommytwoeyes; 09.08.2011
comment
После дальнейшего размышления я вижу, как это может быть неправильным использованием моей части библиотеки (т.е. - должен был вызвать r.content вместо r.read()), но это не объясняет, почему вывод отличается между моим виртуальная машина разработки (при прочих равных условиях выводит строку JSON при вызове r.read()) и производственная машина (которая выводит эту закодированную строку). Любые идеи, почему вывод отличается? - person tommytwoeyes; 09.08.2011
comment
@waveslider Я ничего не знаю о запросах, кроме того, что они есть в моем списке вещей, на которые нужно обратить внимание, но я бы сказал, что это связано с кодировками по умолчанию. Ваш блок разработки, вероятно, UTF-8 (которым должен быть весь JSON), а сервер - это что-то еще. Я предполагаю, что свойство .content просматривает все заголовки кодирования и т. д. и применяет их, в то время как .read() просто вытаскивает байты из сети, и, поскольку оно кодируется по-другому, вы получаете байты. Опять же, все это только догадки. - person Hank Gay; 09.08.2011
comment
Спасибо чувак! Это звучит как довольно хорошее предположение для меня. Как мне определить кодировку по умолчанию для моей рабочей коробки (CentOS 5)? Это переменная конфигурации Python или конфигурация ОС? - person tommytwoeyes; 09.08.2011
comment
В вашей ОС есть кодировка по умолчанию, но я точно не знаю, как Python с ней взаимодействует. Я почти уверен, что есть способ переопределить это, но я не знаю этого сразу. Может быть полезно прочитать HOWTO по Unicode. Лучшим решением, вероятно, является использование .content< /a>, так как это работает и именно так работает код примера. - person Hank Gay; 09.08.2011
comment
Спасибо — вы правы, поэтому я просто использую .content. Это легче. - person tommytwoeyes; 09.08.2011