我试图使用voluptuous来验证来自HTTP请求的JSON输入。但是,它似乎不能很好地处理unicode字符串。
from voluptuous import Schema, Required
from pprint import pprint
schema = Schema({
Required('name'): str,
Required('www'): str,
})
data = {
'name': 'Foo',
'www': u'http://www.foo.com',
}
pprint(data)
schema(data)
上面的代码会产生以下错误:
voluptuous.MultipleInvalid: expected str for dictionary value @ data['www']
但是,如果我从URL中删除u
符号,一切都可以正常工作。这是一个bug还是我做错了?
p。我使用python 2.7,如果它有任何关系。
Python 2.7中有两种字符串类型:str
和unicode
。在Python 2.7中,str
类型不是Unicode字符串,它是一个字节字符串。
所以值u'http://www.foo.com'
确实不是str
类型的实例,你会得到那个错误。如果你希望在Python 2.7中同时支持str
和Unicode字符串,你需要将模式更改为:
from voluptuous import Any, Schema, Required
schema = Schema({
Required('name'): Any(str, unicode),
Required('www'): Any(str, unicode),
})
或者,为了简单起见,如果您总是接收Unicode字符串,那么您可以使用:
schema = Schema({
Required('name'): unicode,
Required('www'): unicode,
})