Разбор списка целых чисел в флеш-отдыхе

Я использую колбу-успокоительный, и у меня возникают проблемы при создании 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 ответа

Решение

Вы можете проверять типы с помощью isinstance, здесь вы устанавливаете тип int (целое число).

Это будет работать так:

a=1    
isinstance(a,int)

оценивается как ИСТИНА

Чтобы проверить это для всего списка, используйте all(). и переберите список с помощью цикла for, чтобы каждый элемент списка проверялся.

if all(isinstance(x,int) for x in integer_list):
    parser.add_argument('integer_list', type=list, location='json')

В вашем случае это должно иметь значение TRUE, если все элементы являются целыми числами, и выполняет код в цикле for.

Вы можете использовать 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.

Вы не можете на самом деле. Поскольку вы можете передать список с несколькими видами типов, например, [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"

Вам нужно использовать действие "добавить".

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

Та же проблема произошла. Я посмотрел в исходный код, и нашел Argument.type в основном используется в ситуации self.type(value), Таким образом, вы можете взломать это как я:

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

Это не то, что он должен делать, но работает.

Другие вопросы по тегам