从BinaryField使用unicode登录sql时出现Django UnicodeEncodeError

时间:2019-05-31 06:20:21

标签: python django unicode

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调试日志记录(当然,它在生产中已禁用)。有什么办法解决这个问题?

1 个答案:

答案 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

  • 按照python 3 logging cookbook

  • 的建议将字节顺序标记(BOM)字符\ ufeff添加到格式化程序中
  • 在日志格式化程序中使用%r代替%s

  • 在格式化程序'format': u'%(asctime)-s %(levelname)s [%(name)s]: %(message)s',上使用python unicode字符串,然后按照this thread的建议使用logging._defaultFormatter = logging.Formatter(u"%(message)s")