Django UnicodeEncodeError при регистрации sql с unicode из BinaryField

Джанго 1.11, Python 3.5, ОС Windows

У меня есть модель Django с BinaryField. Когда я сохраняю экземпляр модели в базе данных, Django выводит следующее сообщение об ошибке:

UnicodeEncodeError: 'charmap' codec can't encode character '\ufffd' in position 216: character maps to <undefined>

Последняя строка трассировки указывает на то, что ошибка возникает в django.db.backends.utils.py -- я добавил комментарий к ошибочной строке:

class CursorDebugWrapper(CursorWrapper):

    # XXX callproc isn't instrumented at this time.

    def execute(self, sql, params=None):
        start = time()
        try:
            return super(CursorDebugWrapper, self).execute(sql, params)
        finally:
            stop = time()
            duration = stop - start
            sql = self.db.ops.last_executed_query(self.cursor, sql, params)
            self.db.queries_log.append({
                'sql': sql,
                'time': "%.3f" % duration,
            })
            ##### Error is reported from the logger.debug statement
            logger.debug(
                '(%.3f) %s; args=%s', duration, sql, params,
                extra = {'duration': duration, 'sql': sql, 'params': params}
            )

Итак, я думаю, что происходит то, что когда Django пытается напечатать оператор вставки SQL, он сталкивается с непечатаемым символом Unicode и выдает ошибку. Я не хочу отключать ведение журнала отладки Django во время разработки (конечно, оно отключено в рабочей среде). Любой способ обойти эту проблему?

Я установил обработчик для регистратора django на INFO, и это предотвращает ошибку. Но тогда я не могу видеть журналы уровня отладки.

jd80 31.05.2019 18:33

Пробовали ли вы использовать '%r' вместо '%s' для предметов, которые могут быть проблематичными?

snakecharmerb 31.05.2019 19:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
503
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Установка кодировки обработчика журнала на utf-8, похоже, работает. Если есть лучший способ, пожалуйста, посоветуйте.

LOGGING = {
    # other config omitted
    'handlers': {
        'django-debug': {
            'level': 'DEBUG',
            'class':'logging.FileHandler',
            'filename': os.path.join(LOCAL_LOGGING_PATH,'django-debug.log'),
            'formatter': 'standard',
            'encoding':'utf8', # this fixes UnicodeEncodeError
        }
    }
}

То, что я пробовал, не сработало. Все они по-прежнему вызывают UnicodeEncodeError:

  • Добавьте from __future__ import unicode_literals вверху settings.py

  • Добавьте символ метки порядка байтов (BOM) \ufeff в модуль форматирования, как это предлагается в кулинарная книга ведения журнала Python 3.

  • Используйте %r вместо %s в средстве форматирования журнала

  • Используйте строку юникода python в средстве форматирования 'format': u'%(asctime)-s %(levelname)s [%(name)s]: %(message)s',, а затем logging._defaultFormatter = logging.Formatter(u"%(message)s"), как это предлагается в эта тема.

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

Похожие вопросы

Как я могу сделать несколько случайных весов для портфелей?
Запуск скрипта через подпроцесс зависает, когда скрипт запускает асинхронный цикл событий внутри многопроцессорных рабочих процессов
Как изменить имя файла, которое автоматически содержит дату в python
Как я могу улучшить этот алгоритм угадывания?
Вложенные списки в маленькие списки (разделенные по категориям)
Как анализировать значения нескольких индексов и создавать файл csv при анализе данных json в python
У меня есть пара команд Linux, которые я хочу запустить на компьютере с Windows. Как запускать команды Linux из Python в Windows
Arxiv API не принимает все условия запроса
Для ключевых слов (строк) в одном столбце и значений (поплавков) в другом я хочу подсчитать количество ключевых слов в порядке, которые попадают на единицу диапазона значения
Я хочу динамически увеличивать яркость и контрастность изображений, чтобы программа была применима для любых новых изображений