Django UnicodeEncodeError при входе в SQL с Unicode из BinaryField - PullRequest
0 голосов
/ 31 мая 2019

Django 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 во время разработки (это, конечно, отключено на производстве).Есть ли способ обойти эту проблему?

1 Ответ

0 голосов
/ 31 мая 2019

Установка кодировки обработчика журнала в 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 logbook cookbook

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...