0

string.decode('utf-8') のおかげで正常に表示される web.py のフォームがありますが、送信時に'ascii' codec can't encode character u'\xf6' in position 1: ordinal not in range(128)attrget の 17 行目で web/form.py から取得します。

そのコードは次のようになります。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() を呼び出す 3 行目は、トリガーされる場所です。

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 でフォームを作成するときにこのエラーを回避するにはどうすればよいでしょうか?

4

1 に答える 1

0

すべての識別子と同様に、属性名はASCII(に変換可能)である必要があります。

[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)
>>>

http://docs.python.org/2/reference/lexical_analysis.html#identifiersを参照してください

于 2013-01-21T20:29:56.693 に答える