在django和unicode中使用python日志时出现问题
现在完全混淆了......我正在开发python / django并使用python日志记录。 我所有的应用程序都需要unicode,我的所有模型都只有一个unicode ()`,return u'..'方法。 现在当我记录时,我遇到了一个很奇怪的问题,那就是花了很长时间才发现我可以重现它。 我已经尝试了Py 2.5.5和Py 2.6.4以及同样的东西。 所以
每当我做一些简单的日志记录就像:
logging.debug(u'new value %s' % group)
这称为模型组。 unicode ():返回unicode(group.name)
我的unicode方法都是这样的:
def __unicode__(self):
return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)
即使group.name是XXX或者(需要unicode),这也可以工作。 但是,当我出于某种原因想要记录一个集合,列表,字典,django-query集合和例如列表中的单个实例可能是unicode或不是我会陷入麻烦......
所以每当一个group.name需要像Luleå(我的家乡)这样的unicode时,这会给我一个UnicodeDecodingError,
logging.debug(u'new groups %s' % list_of_groups)
通常我得到这样的错误:
Exception Type: UnicodeDecodeError
Exception Value: ('ascii', '<RBACInstanceRoleSet: s2 | xc3x84xc3x96xc3x96xc3x85xc3x85xc3x85 Gruppen>]', 106, 107, 'ordinal not in range(128)')
但是,如果我print list_of_groups
在终端上一切都很好
所以,我的理解是,列表开始生成自己,并对其所有元素执行repr(),并返回它们的值 - 在这种情况下,它应该是's2 | ÅÄÖÖ',那么这个列表就表示为(ascii,列表中的东西),然后当试图将ascii解码为unicode时,这当然不起作用 - 因为列表中的一个元素已经被修改过了当你完成repr时,你自己就是一个'...'。
但为什么这是'
为什么事情能够正常工作,并且每当我记录诸如group.name等或group和unicode方法被调用时,unicode / ascii都可以正确处理。 每当我懒惰,想要记录一个列表,设置或其他东西坏了,只要遇到一个Unicode字符...
一些更多的例子工作和失败。 如果group.name
我去模型字段和group
调用__unicode__()
logging.debug("1. group: %s " % group.name) # WORKS
logging.debug(u"2. group: %s " % group) # WORKS
logging.debug("3. group: %s " % group) # FAILS
logging.debug(u"4. group: %s " % group.name) # WORKS
logging.debug("5. group: %s " % group.name) # WORKS
...我真的认为我对Unicode有所掌握;-(
这是我的测试代码:
#-*- coding: utf-8 -*-
class Wrap:
def __init__(self, s): self.s = s
def __repr__(self): return repr(self.s)
def __unicode__(self): return unicode(self.s)
def __str__(self): return str(self.s)
s = 'hello' # a plaintext string
u = 'ÅÄÖÖ'.decode('utf-8')
l = [s,u]
test0 = unicode(repr(l))
test1 = 'string %s' % l
test2 = u'unicode %s' % l
上面的工作很好,当你运行它。 但是,如果将repr的声明更改为:def repr (self):return unicode(self.s)
然后它会中止:
Traceback (most recent call last):
File "mytest.py", line 13, in <module> unicode(l)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
ordinal not in range(128)
所以它看起来像对象层次结构中的某个人有一个repr()实现,它不正确地返回unicode字符串而不是普通字符串。 正如别人提到的,当你做一个格式字符串时
'format %s' % mylist
而mylist是一个序列,python自动调用它的repr()而不是unicode()(因为没有“正确”的方式来表示一个列表为unicode字符串)。
这可能是django,这是错误的,或者你可能在你的一个模型中错误地实现了__repr__
。
我无法用简单的测试重现您的问题:
Python 2.6.4 (r264:75706, Dec 7 2009, 18:45:15) [GCC 4.4.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import logging >>> group = u'Luleå' >>> logging.warning('Group: %s', group) WARNING:root:Group: Luleå >>> logging.warning(u'Group: %s', group) WARNING:root:Group: Luleå >>>
所以,正如丹尼尔所说,在你传递给日志的时候,可能有些东西不是正确的Unicode。
另外,我不知道你正在使用哪些处理程序,但要确保是否有文件处理程序明确指定了要使用的输出编码,并且如果有流处理程序,则还要包含任何需要使用编码的输出流如由codecs
模块提供的封装(并将封装流传递给日志记录)。
尝试在view.py的顶部使用此代码
#-*- coding: utf-8 -*-
...
链接地址: http://www.djcxy.com/p/44135.html
上一篇: Problem when using python logging in django and unicode
下一篇: Trying to know why the OpenMP code does not parallelise