Постоянно 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