为什么Tornado会将所有请求值转换为列表?即使不是吗?

时间:2014-03-26 10:27:18

标签: python tornado

我最近开始使用tornado,有一件令我烦恼的事情是POST值解析。  在一个示例ajax请求中,如果我将名称和电子邮件作为表单数据发送。

服务器中的预期数据是

{ "name": "John Doe", "email": "john@doe.me"}

但它会将每个值转换为如下所示的列表

{"name": ["John Doe"], "email": ["john@doe.me"]}

有人可以解释为什么龙卷风会实现这种行为?它不能简单地返回值而不将其转换为列表吗?

3 个答案:

答案 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来明确您是否需要列表或单个值。