Проблема при использовании регистрации python в django и unicode
полностью запутанный к настоящему времени … Я разрабатываю в python / django и использую журналирование python. Все мое приложение требует unicode, и все мои модели имеют только методы unicode () `, return u '..'. Теперь при регистрации я столкнулся с действительно странной проблемой, и мне потребовалось много времени, чтобы обнаружить, что я могу ее воспроизвести. Я пробовал оба Py 2.5.5 и Py 2.6.4 и то же самое. Так
Всякий раз, когда я делаю несколько прямых записей, таких как:
- django-debug-toolbar не отображается
- Как установить таймаут для отправки электронной почты с помощью django?
- Недопустимое исключение строки состояния при открытии страницы на сервере разработки django
- локальная документация django
- Невозможно импортировать имя simplejson - После установки simplejson
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 ;-(
- Как проверить версию Django
- Переменные среды не устанавливаются после настройки Nginx и Gunicorn (приложение Django на машине Ubuntu)
- Где мои данные JSON в моем входящем запросе Django?
- Django - Rest Framework Несколько моделей
- Есть ли функция в Django / Python, похожая на PHP flush (), которая позволяет мне отправлять часть ответа HTTP клиентам?
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, исправлены проблемы с русским языком
- Самый быстрый метод python / numpy для фильтрации ранга ядра 2d на масках массивов (и / или выборочный рейтинг)
- Как правильно выполнить тестовую изоляцию с помощью модуля Python с состоянием?