Проблема при использовании регистрации python в django и unicode

полностью запутанный к настоящему времени … Я разрабатываю в python / django и использую журналирование python. Все мое приложение требует unicode, и все мои модели имеют только методы unicode () `, return u '..'. Теперь при регистрации я столкнулся с действительно странной проблемой, и мне потребовалось много времени, чтобы обнаружить, что я могу ее воспроизвести. Я пробовал оба Py 2.5.5 и Py 2.6.4 и то же самое. Так

Всякий раз, когда я делаю несколько прямых записей, таких как:

logging.debug(u'new value %s' % group) 

это вызывает группу моделей. unicode (): возвращает unicode (group.name)

Мои методы unicode выглядят так:

 def __unicode__(self): return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role) 

Это работает, даже если group.name XXX или ÄÄÄ (требуется юникод). Но когда я почему-то хочу регистрировать набор, список, словарь, набор django-запросов и отдельные экземпляры, например, список может быть unicode или нет, я попадаю в неприятности …

Таким образом, это даст мне UnicodeDecodingError всякий раз, когда group.name требует unicode, например Luleå (мой родной город)

 logging.debug(u'new groups %s' % list_of_groups) 

Обычно я получаю ошибку:

 Exception Type: UnicodeDecodeError Exception Value: ('ascii', '<RBACInstanceRoleSet: s2 | \xc3\x84\xc3\x96\xc3\x96\xc3\x85\xc3\x85\xc3\x85 Gruppen>]', 106, 107, 'ordinal not in range(128)') 

Но если я print list_of_groups все становится приятным на терминале

Итак, я понимаю, что список начинает генерировать себя и делает repr () для всех его элементов, и они возвращают свои значения – в этом случае это должно быть «s2 | ÄÄÖÖ ', тогда список представляет собой (ascii, the-stuff-in-the-list), а затем, пытаясь декодировать ascii в unicode, это, конечно же, не сработает – поскольку один из элементов в списке повторил а «…» сам по себе, когда на нем было сделано репрезентация.

Но почему это ???? '

И почему все работает, а unicode / ascii обрабатывается правильно всякий раз, когда я записываю простые вещи, такие как group.name и т. Д., Или вызываются группы, и вызывается методы unicode . Всякий раз, когда я становлюсь ленивым и хочу регистрировать список, устанавливать или другие вещи становятся плохими всякий раз, когда встречается символ Юникода …

Еще несколько примеров, которые работают и терпят неудачу. Если group.name я group.name в поле модели, и group вызывает __unicode__()

  logging.debug("1. group: %s " % group.name) # WORKS logging.debug(u"2. group: %s " % group) # WORKS logging.debug("3. group: %s " % group) # FAILS logging.debug(u"4. group: %s " % group.name) # WORKS logging.debug("5. group: %s " % group.name) # WORKS 

… и я действительно думал, что у меня хватит на Unicode ;-(

8 Solutions collect form web for “Проблема при использовании регистрации python в django и unicode”

Вот мой тестовый код:

 #-*- coding: utf-8 -*- class Wrap: def __init__(self, s): self.s = s def __repr__(self): return repr(self.s) def __unicode__(self): return unicode(self.s) def __str__(self): return str(self.s) s = 'hello' # a plaintext string u = 'ÅÄÖÖ'.decode('utf-8') l = [s,u] test0 = unicode(repr(l)) test1 = 'string %s' % l test2 = u'unicode %s' % l 

Вышеуказанное прекрасно работает при запуске. Однако, если вы измените объявление объявления на: def repr (self): верните unicode (self.s)

Затем он прерывается:

 Traceback (most recent call last): File "mytest.py", line 13, in <module> unicode(l) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 

Таким образом, похоже, что кто-то из иерархии объектов имеет реализацию repr (), которая неправильно возвращает строку unicode вместо обычной строки. Как уже упоминалось, когда вы делаете строку формата, например

 'format %s' % mylist 

и mylist – это последовательность, python автоматически вызывает функцию repr (), а не unicode () (так как нет «правильного» способа представления списка в виде строки в Юникоде).

Возможно, это джанго, это ошибка, или, возможно, вы неправильно __repr__ в одну из своих моделей.

#

Я не могу воспроизвести вашу проблему с помощью простого теста:

 Python 2.6.4 (r264: 75706, 7 декабря 2009, 18:45:15) 
 [GCC 4.4.1] на linux2
 Введите «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.
 >>> импорт журнала
 >>> group = u'Luleå '
 >>> logging.warning ('Группа:% s', группа)
 ПРЕДУПРЕЖДЕНИЕ: корень: Группа: Лулео
 >>> logging.warning (u'Group:% s ', group)
 ПРЕДУПРЕЖДЕНИЕ: корень: Группа: Лулео
 >>> 

Итак, как говорит Дэниел, возможно, что-то, что не соответствует Юникоду, в том, что вы передаете в журнал.

Кроме того, я не знаю, какие обработчики вы используете, но убедитесь, что есть обработчики файлов, в которых вы явно указываете используемую кодировку вывода, и если есть обработчики потоков, вы также переносите любой выходной поток, который нуждается в нем с кодировкой которая предоставляется модулем codecs (и передает завернутый поток в журнал).

Попробуйте использовать этот код в верхней части вашего view.py

 #-*- coding: utf-8 -*- ... 

Я не понимаю, что вы не понимаете, если вы понимаете, что я имею в виду. Ваш средний абзац:

Итак, я понимаю, что список начинает генерировать себя и делает repr () для всех его элементов, и они возвращают свои значения – в этом случае это должно быть «s2 | ÄÄÖÖ ', тогда список представляет собой (ascii, the-stuff-in-the-list), а затем, пытаясь декодировать ascii в unicode, это, конечно же, не сработает – поскольку один из элементов в списке повторил а «…» сам по себе, когда на нем было сделано репрезентация.

объясняет точно, что происходит – вывод списка – это не то же самое, что печать всех его элементов, потому что под капотом все, что он делает, это вызов repr () для каждого элемента в списке. Вместо того, чтобы выводить необработанный список, вы можете записать список, который вызывает unicode для каждого элемента, который исправит его.

Я закончил следовать советам, как ответил и перешел ко всему коду, и понял список или подобное при попытке регистрации набора / list / dict / django queryset. Поэтому адаптация и добавление подобных вещей помогло мне:

 logging.debug(u"new groups: %s" % [unicode(g) for g in list_of_groups]) 

Так что теперь все, что я должен сделать, это помнить, что никогда не забывайте это делать 😉

вы пытались вручную сделать любой результат unicode?

 logging.debug(u'new groups %s' % unicode(list_of_groups("UTF-8")) 

Я столкнулся с теми же проблемами: см. http://hustoknow.blogspot.com/2012/09/unicode-quirks-in-django.html .

Вы можете объявить метод str () переопределить поведение Django по умолчанию, которое поможет избежать этой проблемы. Или вы всегда должны префикс u 'перед вашими заявлениями logging ().

Проверьте:

 import locale locale.getpreferredencoding() 

должен быть «utf8». У меня есть «cp1252».

Помогли мне добавить manage.py:

 import _locale _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8']) 

Windows 10, Django 1.10.3, Python 3.5.2, исправлены проблемы с русским языком

  • Просто сохраните файл в папке в Django
  • Как безопасные каталоги? И как создавать новые каталоги при регистрации пользователя?
  • Проблема Django QuerySet .defer () - ошибка или функция?
  • Установка lxml с pip в virtualenv Ошибка Ubuntu 12.10: команда 'gcc' не удалась с статусом выхода 4
  • django 1.3 Пользовательский запрос соответствия файла не существует
  • Разрешение пользователям удалять свои собственные комментарии в Django
  • абстрактные модели джанго и регулярное наследование
  • python django - нет модуля psycopg2.extension даже после установки скомпилированной версии psycopg2-2.4.5.win32-py2.7.exe
  •  
    Interesting Posts for Van-Lav

    Джанго-модель u'id 'сталкивается при использовании OneToOneField

    Перенаправления Python Перенаправление не поддерживается

    Получить данные JSON in Flask

    Как XOR две строки, содержащие шестнадцатеричные числа в python?

    Python WindowsError: Неверное имя файла, имени каталога или тома:

    Поиск сетки с рекурсивной функцией Устранение в конвейере scikit-learn возвращает ошибку

    Функция разложения временной серии в Python

    Указание настраиваемых полей для контактов в API контактов Google v3

    Есть ли способ получить vim для автоматического переноса строк python на 79 символов?

    pandas read_csv с последним столбцом, содержащим запятые

    Итератор файла Python по двоичному файлу с более новой идиомой

    Как эмулировать поведение os.path.samefile в Windows и Python 2.7?

    pip не устанавливается в каталог сайтов-пакетов из virtualenv, когда я использую require.txt

    webbrowser.get («firefox») на Mac с Firefox «не смог найти исполняемый браузер»

    Как поставлять входные данные stdin, files и environment в модульные тесты Python?

    Python - лучший язык программирования в мире.