Джанго 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 во время разработки (конечно, оно отключено в рабочей среде). Любой способ обойти эту проблему?
Пробовали ли вы использовать '%r'
вместо '%s'
для предметов, которые могут быть проблематичными?
Установка кодировки обработчика журнала на 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")
, как это предлагается в эта тема.
Я установил обработчик для регистратора
django
на INFO, и это предотвращает ошибку. Но тогда я не могу видеть журналы уровня отладки.