我最近开始使用tornado
,有一件令我烦恼的事情是POST
值解析。
在一个示例ajax请求中,如果我将名称和电子邮件作为表单数据发送。
服务器中的预期数据是
{ "name": "John Doe", "email": "john@doe.me"}
但它会将每个值转换为如下所示的列表
{"name": ["John Doe"], "email": ["john@doe.me"]}
有人可以解释为什么龙卷风会实现这种行为?它不能简单地返回值而不将其转换为列表吗?
答案 0 :(得分:2)
我认为,无论这些值是否为列表,都可以统一使用,而无需检查,如果它们是列表。
E.g。想象你想用name
做一些事情,但因为它有时可能是一个列表,有时候只是一个值,每次你使用name
时,你都必须包含类似
if isinstance(name, list):
# Handle the list
else:
# Handle a string
相反,您可以访问name[0]
而无需担心您可能正在访问字符串的第一个字符。
<强>声明强>
我不是龙卷风开发者;你必须向他们询问他们遵守这一惯例的原因。
答案 1 :(得分:2)
Tornado支持相同参数名称的多个值:
http://example.com/page?foo=1&foo=2
显然,这被解析为:
{'foo': ['1', '2']}
如果只有一个值,Tornado 可以将每个值设置为字符串,如果有多个值,则将字符串列表设置为字符串列表。然后,您的代码必须在使用其内容之前检查每个值的类型。但是,将所有值一直包装在列表中会更方便,而且更不容易出错。
答案 2 :(得分:1)
这不仅仅是龙卷风 - 这就是如何定义form-urlencoded格式。每个参数可能会出现多次,您无法知道出现过一次的参数是单个元素列表还是单个值。为了避免考虑这一点,您对请求参数的大多数访问应该通过RequestHandler.get_argument和RequestHandler.get_arguments来明确您是否需要列表或单个值。