可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm using the flask-restful, and I'm having trouble constructing a RequestParser
that will validate a list of only integers. Assuming an expected JSON resource format of the form:
{
'integer_list': [1,3,12,5,22,11, ...] # with a dynamic length
}
... and one would then create a RequestParser using a form something like:
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('integer_list', type=list, location='json')
... but how can i validate is an integer list?
回答1:
You can check types with isinstance, here you set the type to int (integer).
This would work like this:
a=1
isinstance(a,int)
evaluates to TRUE
To check this for a whole list use all(). and loop through the list with the for loop so every element of the list gets checked.
if all(isinstance(x,int) for x in integer_list):
parser.add_argument('integer_list', type=list, location='json')
In your case this should evaluate to TRUE if all elements are integers and executes the code in the for loop
回答2:
You can use action='append'. For example:
parser.add_argument('integer_list', type=int, action='append')
Pass multiple integer parameters:
curl http://api.example.com -d "integer_list=1" -d "integer_list=2" -d "integer_list=3"
And you will get a list of integers:
args = parser.parse_args()
args['integer_list'] # [1, 2, 3]
An invalid request will automatically get a 400 Bad Request response.
回答3:
You cannot in fact. Since you can pass a list with multiple kinds of types, e.g. [1, 2, 'a', 'b']
, with reqparser, you can only parse with type=list
.
You need to check the elements of the list one by one by yourself. The code looks like below:
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"
回答4:
Same issue occurred. I looked into the source code, and found Argument.type
is mainly used in the situation self.type(value)
.
So you can hack this like me:
parser.add_argument('integer_list', type=json.loads, location='json')
It's not what it supposed to do, but works.