Django 1.11,Python 3.5,Windows OS
我有一个带BinaryField的Django模型。当我将模型的实例保存到数据库时,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调试日志记录(当然,它在生产中已禁用)。有什么办法解决这个问题?
答案 0 :(得分:0)
将日志处理程序的编码设置为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:
在settings.py顶部添加from __future__ import unicode_literals
在日志格式化程序中使用%r代替%s
在格式化程序'format': u'%(asctime)-s %(levelname)s [%(name)s]: %(message)s',
上使用python unicode字符串,然后按照this thread的建议使用logging._defaultFormatter = logging.Formatter(u"%(message)s")