1.5.1 INTRODUCING FORMSDICT(介绍表格字典)

来源:互联网 发布:快乐宝拉 知乎 编辑:程序博客网 时间:2024/06/06 11:40

Bottle用一种特殊类型的字典来存储数据和cookie。

表格字典(FormsDict)用起来就像普通的字典那样,但是增加了一些新特性,能让你的开发变得简单。

属性使用:所有在字典中的值都能当做属性使用。这些虚拟的属性返回unicode字符串,即使该值根本不存在或是unicode转换失败~ 在这种情况下,返回空串:

name = request.cookies.name# is a shortcut for:name = request.cookies.getunicode('name') # encoding='utf-8' (default)# which basically does this:try:    name = request.cookies.get('name', '').decode('utf-8')except UnicodeError:    name = u''

每个键有多个值:FormsDict是MultiDict的子类,并且它每个键可以存储多个值。标准的字典只会返回单个值,但是表格字典的getall()方法返回一个指定键所对应所有值得列表(当然有可能是空的):

for choice in request.forms.getall('multiple_choice'):    do_something(choice)
WTForms(用来处理表单的Python库) 支持:一些库(比如 WTForms)要求字典中的输入全是unicode字符串。FormsDict.decode()方法就是干这个用的。它能解码所有的值并返回备份,它为每个键保存多个值并提供其余所有细节。

注意:

在 Python2 中所有的键和值都是字节字符串。如果你需要unicode,你可以调用FormsDict.getunicode() 或者分别处理每个属性。每个方法都尝试解码字符串(默认:utf-8),如果失败了,会返回空串。没必要接收UnicodeError异常:

>>> request.query['city']'G\xc3\xb6ttingen'  # A utf8 byte string>>> request.query.cityu'Göttingen'        # The same string as unicode

在Python3中所有的字符串都是unicode的,但是HTTP是基于字节的协议。服务器必须在数据传到应用前对字节字符串进行解码。在安全性方面,WSGi建议 ISO-8859-1 (即latin1),一个可逆的单字节编解码器能在稍后以不同方式编码。Bottle通过 FormsDict.getunicode()和属性访问做到了这些,但不是处理字典的方法。给服务器返回这些不可改变的值,你也许不喜欢这种方法。

>>> request.query['city']'Göttingen' # An utf8 string provisionally decoded as ISO-8859-1 by the server>>> request.query.city'Göttingen'  # The same string correctly re-encoded as utf8 by bottle
如果你需要从整个字典解码出需要的值(比方说WTForms),你可以用FormsDict.decode()方法得到一份再编码的备份。


0 0
原创粉丝点击