Python web.py Form.validates()错误,属性名称中包含utf-8字符

Python web.py Form.validates()错误,属性名称中包含utf-8字符,python,unicode,utf-8,web.py,Python,Unicode,Utf 8,Web.py,我在web.py中有一个表单,由于string.decode('utf-8'),它显示得很好,但是当它提交时,我得到一个'ascii'编解码器无法对位于位置1的字符u'\xf6'进行编码:序号不在范围(128)中的attrget的web/form.py,第17行 代码如下所示,第17行是except块中的过程 def attrget(obj, attr, value=None): try: if hasattr(obj, 'has_key') and obj.has_ke

我在web.py中有一个表单,由于string.decode('utf-8'),它显示得很好,但是当它提交时,我得到一个
'ascii'编解码器无法对位于位置1的字符u'\xf6'进行编码:序号不在范围(128)
中的attrget的web/form.py,第17行

代码如下所示,第17行是except块中的过程

def attrget(obj, attr, value=None):
    try:
        if hasattr(obj, 'has_key') and obj.has_key(attr): 
            return obj[attr]
    except TypeError:
        # Handle the case where has_key takes different number of arguments.
        # This is the case with Model objects on appengine. See #134
        pass
    if hasattr(obj, attr):
        return getattr(obj, attr)
    return value
它一定是关于编码的,因为如果我删除瑞典语字符,表单就会工作。下面是表单定义

searchForm = form.Form(
    form.Textbox('Startdatum', id='datepickerStart'),
    form.Textbox('Slutdatum', id='datepickerEnd'),
    form.Textbox('IPadress', validIPaddress),
    form.Textbox('Macadress', validMacaddress),
    form.Button('Sök'.decode('utf-8'), type='submit', description='Search')
)
第三行调用Form.validates(),是触发它的地方

def POST(self):
    form = self.searchForm()
    if not form.validates():
        headerMsg = 'Du skrev något fel, gör om, gör rätt.'.decode('utf-8')
        return tpl.index(headerMsg, form)

    return tpl.index(headerMsg='Inga rader hittades', form=form)
完整的回溯如下

Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 239, in process
return self.handle()
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 230, in handle
    return self._delegate(fn, self.fvars, args)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 420, in _delegate
    return handle_class(cls)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/application.py", line 396, in handle_class
    return tocall(*args)
  File "/home/mkbnetadm/netadmin/na.py", line 36, in POST
    if not form.validates():
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/form.py", line 76, in validates
    v = attrget(source, i.name)
  File "/usr/local/lib/python2.6/dist-packages/web.py-0.37-py2.6.egg/web/form.py", line 18, in attrget
    if hasattr(obj, attr):
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 1: ordinal not in range(128)

那么,在web.py中创建表单时,如何避免此错误呢

与所有标识符一样,属性名称必须是(可转换为)ASCII:

[Python 2.6.6]
>>>foo=object()
>>>hasattr(foo,'o')
假的
>>>hasattr(foo,u'o')
假的
>>>hasattr(foo,u'\xf6')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeEncodeError:“ascii”编解码器无法对位置0中的字符u'\xf6'进行编码:
序号不在范围内(128)
>>>

请看

我不明白
'Sök'的所有用法。解码('utf-8')
。为什么不首先使用Unicode:
u'Sök'
?@DanielRoseman使用uString也可以,但不能解决问题。不,我没有说会(这就是为什么我把它作为评论而不是答案发布的原因)。但是,您确实需要显示正确的回溯,因为错误显然不是由
pass
语句引起的。@manu fatto我编辑了这篇文章,谢谢。@DanielRoseman添加了完整的回溯。我编写的代码应该最终使用jquery进行表单提交和验证,因此,我通过继续解决这个问题,而不是使用内置的web.py表单验证。但既然你可能是对的,我就把你的帖子作为答案。
[Python 2.6.6]
>>> foo = object()
>>> hasattr(foo, 'o')
False
>>> hasattr(foo, u'o')
False
>>> hasattr(foo, u'\xf6')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
>>>