2015-01-03 5 views
4

Я использую flask-restful, и мне не удается создать RequestParser, который будет проверять список только целых чисел. Предполагая, что ожидаемый формат JSON ресурса формы:Разбор целых чисел в колбе-restful

{ 
    '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') 

... но как я могу проверить это целочисленный список?

ответ

-2

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

Это будет выглядеть так:

a=1  
isinstance(a,int) 

принимает значение ИСТИНА

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

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

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

+0

У меня есть аналогичное обходное решение, я искал все, что я мог неправильно прочитать в документах. Так или иначе, я подниму вас. – Ricardo

+0

Как я могу перебирать integer_list без его определения? NameError: глобальное имя 'integer_list' не определено. – Hussain

+0

Этот ответ явно упускает суть вопроса. OP пытается использовать 'parser' для получения' integer_list'. Неверный запрос «integer_list» для определения того, как разбирать себя. – Chris

22

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

+3

Это должно быть отмечено как ответ. – Debriter

+0

Отличный ответ.Например, странно использовать вызов curl в качестве примера. Практически все заинтересованы в стандартном URL-адресе. Пример: http://www.example.com/v1/user/?id=1&id=2 – melchoir55

+0

Это не обычный вариант использования, но это простой способ объединить ваш код. – oferei

-1

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

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

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

2

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

Ответчик спросил, что данные json не формируют данные, поэтому в этом случае мы можем проверить только тип списка, как показано ниже, а затем, когда мы получим список, нам нужно проверить элемент один за другим, я добавлю пример кода. – Eric

+0

@Ajean В то время, когда я рассмотрел этот ответ, это был не что иное, как комментарий, и не представил никакой новой информации. – cpburnz

Смежные вопросы