7

我正在使用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')

...但是我如何验证是一个整数列表?

4

5 回答 5

39

您可以使用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 响应。

于 2015-05-12T10:57:03.190 回答
3

事实上你不能。由于您可以传递具有多种类型的列表,例如[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"
于 2017-05-30T14:03:45.793 回答
1

您需要使用“附加”操作。

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']
于 2019-09-19T06:56:18.170 回答
-1

您可以使用 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

于 2015-01-03T19:12:18.260 回答
-1

发生了同样的问题。我查看了源代码,发现Argument.type主要是用在这种情况下self.type(value)。所以你可以像我一样破解这个:

parser.add_argument('integer_list', type=json.loads, location='json')

这不是它应该做的,而是有效的。

于 2015-12-02T10:33:42.780 回答