在Django和unico中使用python登录时出现问题

2024-06-28 19:01:27 发布

您现在位置:Python中文网/ 问答频道 /正文

现在完全糊涂了。。。我在python/django中开发并使用python日志。我的所有应用程序都需要unicode,而我的所有模型都只实现了一个unicode()`,return u'..'方法。现在,当我登录时,我遇到了一个非常奇怪的问题,我花了很长时间才发现我可以复制它。我试过PY2.5.5和PY2.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查询集合和其中的单个实例(例如,列表可能是unicode或不是unicode)时,我会遇到麻烦。。。

因此,每当group.name需要像Luleå(我的家乡)这样的unicode时,这将给我带来unicodedecoding错误

logging.debug(u'new groups %s' % list_of_groups)

通常我会遇到这样的错误:

Exception Type:     UnicodeDecodeError
Exception Value:    ('ascii',  '<RBACInstanceRoleSet: s2 | \xc3\x84\xc3\x96\xc3\x96\xc3\x85\xc3\x85\xc3\x85 Gruppen>]', 106, 107, 'ordinal not in range(128)')

但如果我这么做,终端上一切都会好起来的

所以,我的理解是,列表开始生成自己,并对其所有元素执行repr(),它们返回它们的值——在本例中,它应该是“s2 |ÄÖ”,然后列表将自己呈现为(ascii,当试图将ascii解码成unicode时,这当然不起作用,因为当repr完成时,列表中的一个元素重新获得了u'…'。

但这是为什么????'

以及为什么每当我记录诸如group.name和so或group之类的简单事情时,都会正确处理unicode/ascii,并调用unicode方法。每当我懒洋洋地想记录一个列表、集合或其他东西时,每当遇到unicode字符时就会出错。。。

还有一些成功和失败的例子。如果group.name我转到model字段并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;--


Tags: django方法namedebug模型self列表logging
3条回答

尝试在views.py的顶部使用此代码

#-*- coding: utf-8 -*-
...

这是我的测试代码:

#-*- 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的声明更改为: defrepr(self):返回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å
>>> 

所以,正如Daniel所说,在您传递给日志的内容中,可能有一些不正确的Unicode。

另外,我不知道您使用的是什么处理程序,但请确保是否有文件处理程序显式指定要使用的输出编码,如果有流处理程序,您还可以使用codecs模块提供的编码包装器包装任何需要它的输出流(并将包装的流传递给日志记录)。

相关问题 更多 >