性感:如何从 HTTP POST 中的 json 数据验证非字符串值
voluptuous: how to validate non-string value from json data in HTTP POST
我正在使用 Flask 实现一些 REST API。在其中一个 API 中,我需要提交一个由经度和纬度定义的位置。所以我很自然地用 httpie 来做这个:
http POST :5000/api/v1.0/foo lng=12.34 lat=56.78
在 flask 端,我正在使用 voluptuous 来验证 JSON 数据。但是,后端接收到的所有数据都是 unicode
类型的。我必须做这样的事情:
try:
lng = atof(data['lng'])
schema(data)
except KeyError:
raise SomeError
except MultipleInvalid:
raise SomeError
这感觉很笨拙,有点违背性感的目的。是我做错了,还是有更好的方法?
是的,该库能够将值强制转换为浮点数或整数(使用 Coerce
)。例如:
>>> from voluptuous import *
>>> schema = Schema(Coerce(float))
>>> schema('1.10')
1.1
>>> schema(2.2)
2.2
这意味着它将接受纯浮点数,但也接受可以转换为浮点数的 (Unicode) 字符串。结果值是一个浮点数。
您还可以组合多个验证器,浮点值将传递给下一个验证器:
schema = Schema(All(Coerce(float), Range(min=200)))
此架构将验证输入值是否可以强制转换为浮点数并且浮点值至少为 200。
我正在使用 Flask 实现一些 REST API。在其中一个 API 中,我需要提交一个由经度和纬度定义的位置。所以我很自然地用 httpie 来做这个:
http POST :5000/api/v1.0/foo lng=12.34 lat=56.78
在 flask 端,我正在使用 voluptuous 来验证 JSON 数据。但是,后端接收到的所有数据都是 unicode
类型的。我必须做这样的事情:
try:
lng = atof(data['lng'])
schema(data)
except KeyError:
raise SomeError
except MultipleInvalid:
raise SomeError
这感觉很笨拙,有点违背性感的目的。是我做错了,还是有更好的方法?
是的,该库能够将值强制转换为浮点数或整数(使用 Coerce
)。例如:
>>> from voluptuous import *
>>> schema = Schema(Coerce(float))
>>> schema('1.10')
1.1
>>> schema(2.2)
2.2
这意味着它将接受纯浮点数,但也接受可以转换为浮点数的 (Unicode) 字符串。结果值是一个浮点数。
您还可以组合多个验证器,浮点值将传递给下一个验证器:
schema = Schema(All(Coerce(float), Range(min=200)))
此架构将验证输入值是否可以强制转换为浮点数并且浮点值至少为 200。