2015-01-03 83 views
4

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

...但我如何可以驗證是整數列表?

回答

-2

您可以使用isinstance檢查類型,在此將類型設置爲int(整數)。

這將這樣的工作:

a=1  
isinstance(a,int) 

值爲TRUE

要檢查這對整個列表所有使用()。並使用for循環遍歷列表,以便檢查列表中的每個元素。

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

你的情況,這應該評估爲true,如果所有元素都是整數,並在for循環

+0

我有一個類似的解決方法,我一直在尋找任何可能在文檔中誤讀的東西。無論如何,我會upvote你。 – 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錯誤的請求響應。

+3

這應該被標記爲答案。 – Debriter

+0

很好的回答。不過,這種奇怪的使用curl調用的例子。幾乎每個人都會對標準網址感興趣。例如: 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