1. Здравствуйте.

    Хочу разобраться, что именно страдает: реализация OpenID консьюмера в библиотеке python-openid или openid.yandex.ru.

    Выполняем по шагам...

    1. Заходим на http://openidenabled.com/python-openid/trunk/examples/consumer/ (пример консьюмера).
    2. Вводим openid.yandex.ru.
    3. Говорим Яндексу "Передать дополнительные данные", среди которых будет псевдоним, который необходимо заполнить русскими буквами.

    ... и получаем ошибку:

    UnicodeDecodeError at /consumer/finish/
    'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
    

    Конкретно ругается на строку кодирования в utf-8.

    for (ns_uri, ns_key), value in self.args.iteritems():
        key = self.getKey(ns_uri, ns_key)
        args[key] = value.encode('UTF-8')
    

    Если я правильно понял спецификацию, то сообщения и данные форм должны быть представлены в кодировке utf-8. Яндекс так данные и передаёт:

    openid.sreg.nickname '\xd0\x94\xd0\xbc\xd0\xb8\xd1\x82\xd1\x80\xd0\xb8\xd0\xb9 \xd0\x9a\xd1\x83\xd1\x80\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xb2'
    

    А приведённый выше кусок кода пытается кодировать значения в utf-8, как будто они декодированы.

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

  2. Иван Сагалаев

    25.08.2009

    0 ↑
    0 ↓

    Это консумер из example глючит, мы на это наталкивались, когда сервер тестировали. Ошибка очень простая, там где-то в потрохах строка к юникоду приводится через умолчальную кодировку (ascii), а не utf-8. Потому и падает на русских символах.

    В принципе, можно просто передавать ascii-строки в SRE, для отладки ведь это не принципиально.

  3. Ясно.

    Спасибо.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.