Постоянно Python-клиент вызывает UnicodeDecodeError при предоставлении не-ASCII символов

Я пытаюсь создать учетные записи из API Recurly с помощью клиента Python. Python 2.7, рекурсия 2.2.17

При создании новой учетной записи с именем (или любым другим атрибутом на самом деле), содержащим не-ascii символы (выбирается как unicode), спасение сущности поднимает UnicodeDecodeError: 'ascii' codec can't decode byte [...]

Просто account.first_name = u'Frédérique-Fançois'.encode('utf-8') все еще вызывает ту же ошибку, но на другом уровне в модуле.

1 ответ

Решение

recurly.API_KEY а также recurly.SUBDOMAIN должен быть пройден str объекты.

Вы можете быть в беде, если вы используете unicode_literals или если ваш источник конфигурации предоставляет unicode ценности. В этом случае вам нужно конвертировать их либо через str если значения не содержат не-ascii символов, или с encode(),

Например

from __future__ import unicode_literals

# You can force it like this
account.API_KEY = str('my api key here')
account.SUBDOMAIN = str('advanseez')

Это гарантирует, что основной httplib не будет конвертировать HTTP заголовки в unicode таким образом, конфликтующие с любыми не-ascii символами представляют тело сообщения, которое всегда str при работе с клиентом Recurly.

Таким образом, вы можете безопасно назначать атрибуты в любом ресурсе Recurly, используя unicode,

Например

account = recurly.Account(account_code='12345689', first_name=u'Frédérique-François')
account.save()  # Works without raising UnicodeDecodeError

Подробную демонстрацию проблемы, обходной путь и объяснение ее происхождения см. В (Примечание об использовании import unicode_literals, который изменяет тип строки по умолчанию на Unicode): https://gist.github.com/maximehardy/d3a0a6427d2b6791b3dc

Другие вопросы по тегам