解析 flask-restful 中的整数列表
Parsing a list of integers in flask-restful
我正在使用 flask-restful,但我在构建一个仅验证整数列表的 RequestParser
时遇到了问题。假定预期的 JSON 形式的资源格式:
{
'integer_list': [1,3,12,5,22,11, ...] # with a dynamic length
}
...然后将使用类似以下的形式创建 RequestParser:
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('integer_list', type=list, location='json')
...但是我如何验证是一个整数列表?
可以用isinstance检查类型,这里设置类型为int(整数)。
这会像这样工作:
a=1
isinstance(a,int)
计算结果为 TRUE
要检查整个列表,请使用 all()。并使用 for 循环遍历列表,以便检查列表中的每个元素。
if all(isinstance(x,int) for x in integer_list):
parser.add_argument('integer_list', type=list, location='json')
在您的情况下,如果所有元素都是整数并执行 for 循环中的代码,这应该评估为 TRUE
您可以使用 action='append'。例如:
parser.add_argument('integer_list', type=int, action='append')
传递多个整数参数:
curl http://api.example.com -d "integer_list=1" -d "integer_list=2" -d "integer_list=3"
你会得到一个整数列表:
args = parser.parse_args()
args['integer_list'] # [1, 2, 3]
无效请求将自动获得 400 Bad Request 响应。
发生同样的问题。我查看了源代码,发现Argument.type
主要用于self.type(value)
的情况。
所以你可以像我一样破解这个:
parser.add_argument('integer_list', type=json.loads, location='json')
这不是它应该做的,但有效。
事实上你不能。由于您可以传递具有多种类型的列表,例如[1, 2, 'a', 'b']
,用reqparser,只能用type=list
解析。
您需要自己将列表的元素一一检查。代码如下所示:
parse_result = parser.add_argument('integer_list', type=list, location='json')
your_list = parse_result.get('integer_list', [])
for element in your_list:
if isinstance(element, int):
# do something
print "element is int"
else:
# do something else
print "element is not int"
您需要使用 'append' 操作。
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('integer_list', type=int, action="append", location='json')
args = parser.parse_args()
list_of_int = args['integer_list']
我正在使用 flask-restful,但我在构建一个仅验证整数列表的 RequestParser
时遇到了问题。假定预期的 JSON 形式的资源格式:
{
'integer_list': [1,3,12,5,22,11, ...] # with a dynamic length
}
...然后将使用类似以下的形式创建 RequestParser:
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('integer_list', type=list, location='json')
...但是我如何验证是一个整数列表?
可以用isinstance检查类型,这里设置类型为int(整数)。
这会像这样工作:
a=1
isinstance(a,int)
计算结果为 TRUE
要检查整个列表,请使用 all()。并使用 for 循环遍历列表,以便检查列表中的每个元素。
if all(isinstance(x,int) for x in integer_list):
parser.add_argument('integer_list', type=list, location='json')
在您的情况下,如果所有元素都是整数并执行 for 循环中的代码,这应该评估为 TRUE
您可以使用 action='append'。例如:
parser.add_argument('integer_list', type=int, action='append')
传递多个整数参数:
curl http://api.example.com -d "integer_list=1" -d "integer_list=2" -d "integer_list=3"
你会得到一个整数列表:
args = parser.parse_args()
args['integer_list'] # [1, 2, 3]
无效请求将自动获得 400 Bad Request 响应。
发生同样的问题。我查看了源代码,发现Argument.type
主要用于self.type(value)
的情况。
所以你可以像我一样破解这个:
parser.add_argument('integer_list', type=json.loads, location='json')
这不是它应该做的,但有效。
事实上你不能。由于您可以传递具有多种类型的列表,例如[1, 2, 'a', 'b']
,用reqparser,只能用type=list
解析。
您需要自己将列表的元素一一检查。代码如下所示:
parse_result = parser.add_argument('integer_list', type=list, location='json')
your_list = parse_result.get('integer_list', [])
for element in your_list:
if isinstance(element, int):
# do something
print "element is int"
else:
# do something else
print "element is not int"
您需要使用 'append' 操作。
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('integer_list', type=int, action="append", location='json')
args = parser.parse_args()
list_of_int = args['integer_list']