解析 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']