【问题标题】:Parsing a list of integers in flask-restful在 flask-restful 中解析整数列表
【发布时间】:2015-03-01 17:56:45
【问题描述】:

我正在使用flask-restful,但在构造RequestParser 时遇到了麻烦,该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')

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

【问题讨论】:

    标签: python json rest flask flask-restful


    【解决方案1】:

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

    【讨论】:

    • 很好的答案。不过,以 curl 调用为例有点奇怪。几乎每个人都会对标准网址感兴趣。示例:example.com/v1/user/?id=1&id=2
    • 这不是通常的用例,但它是一种统一代码的简单方法。
    【解决方案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"
    

    【讨论】:

    • 提问者询问的是json数据而不是表单数据,所以在这种情况下,我们只能像下面这样检查列表类型,那么当我们得到列表时,我们需要一个一个地检查元素,我添加示例代码。
    • @Ajean 在我查看此答案时,它只不过是一条评论,并没有提供任何新信息。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以用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

      【讨论】:

      • 我有一个类似的解决方法,我正在寻找我可能在文档中误读的任何内容。无论如何,我会支持你。
      • 如何在不定义整数列表的情况下对其进行迭代? NameError:未定义全局名称“integer_list”。
      • 这个答案显然没有抓住问题的重点。 OP 正在尝试使用parser 来获取integer_list。要求定义 integer_list 以了解如何解析自身是不正确的。
      • 这只适用于flask_restful 0.3.5及以下版本,对于0.3.6,唯一有效的是底部@oferei给出的答案(int with action='append')
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-02
        • 2018-01-18
        • 2017-10-08
        • 2014-07-21
        • 1970-01-01
        • 1970-01-01
        • 2015-12-22
        • 2018-08-09
        相关资源
        最近更新 更多