Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Tornado会将所有请求值转换为列表?即使不是?_Python_Tornado - Fatal编程技术网

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

Python 为什么Tornado会将所有请求值转换为列表?即使不是?,python,tornado,Python,Tornado,我最近开始使用tornado,有一件事让我很恼火,那就是它的POST值解析。 在一个ajax请求示例中,如果我将姓名和电子邮件作为表单数据发送 服务器中的预期数据为 { "name": "John Doe", "email": "john@doe.me"} 但它会将每个值转换为如下所示的列表 {"name": ["John Doe"], "email": ["john@doe.me"]} 有人能解释为什么龙卷风中会出现这种行为吗?它不能简单地返回值而不将其转换为列表吗?我想这是这样的,无论值

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

服务器中的预期数据为

{ "name": "John Doe", "email": "john@doe.me"}
但它会将每个值转换为如下所示的列表

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

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

我想这是这样的,无论值是否为列表,它们都可以以统一的方式使用,而不必检查它们是否为列表

例如,假设您想用
name
做一些事情,但由于它有时是一个列表,有时是一个值,因此每次使用
name
时,您都必须包含以下内容

if isinstance(name, list):
    # Handle the list
else:  
    # Handle a string
相反,您可以访问
name[0]
,而不用担心您可能正在访问字符串的第一个字符

免责声明


我不是龙卷风的开发者;你必须问他们参加这个大会的原因才能确定

Tornado支持同一参数名的多个值:

http://example.com/page?foo=1&foo=2

显然,这被解析为:

{'foo':['1','2']}


Tornado如果只有一个值,则可以将每个值设置为一个字符串,如果有多个值,则可以将字符串列表设置为一个字符串。然后,代码必须在使用每个值的内容之前检查其类型。但是,始终将所有值包装在列表中更方便,也更不容易出错。

这不仅仅是tornado,这就是URL编码格式的定义方式。每个参数可能出现多次,您无法知道出现一次的参数是要作为单个元素列表还是单个值。为了避免考虑这一点,您对请求参数的大多数访问都应该通过RequestHandler.get_参数和RequestHandler.get_参数,以明确您希望的是列表还是单个值。

webob的MultiDict在我看来确实更优雅,但tornado的方式让您始终准确地知道您将得到什么,帖子是否有重复的密钥。不过,你必须向开发者询问“为什么?”的真实答案。龙卷风开发者本·达内尔(Ben Darnell)对a.Jesse Jiryu Davis的回答发表了评论。我会说这是最权威的答案。但你不认为强迫用户使用列表会在90%的时间里产生开销,而你只发送一个值而不是一个列表吗?有可能在Tornado中包含内部逻辑,以根据输入输出字符串或列表,实际上会产生更大的开销,因此,如果需要的话,他们会将逻辑留给用户来包含,尽管我不能确定。不仅仅是tornado,表单urlencoded格式就是这样定义的。每个参数可能出现多次,您无法知道出现一次的参数是要作为单个元素列表还是单个值。为了避免考虑这一点,您对请求参数的大多数访问都应该通过RequestHandler.get_参数和RequestHandler.get_参数,以明确您希望的是列表还是单个值。@BenDarnell能否将此添加为答案,以便我可以接受:-)