argparse POST数组或列表

时间:2018-11-03 20:44:46

标签: python rest api flask

我正在尝试解析每项服务的一个或多个“部长/发言人”的列表。在对API的RESTful调用中。我正在使用argparse:

from flask_restful import Resource, reqparse

parser = reqparse.RequestParser()

parser.add_argument('service_id',
    type=int,
    required=True,
    help="Every service needs a service id.")

parser.add_argument('church_id',
    type=int,
    required=True,
    help="Every service needs a church id.")

parser.add_argument('speakers',
    type = list,
    default=[],
    required=True,
    help="Every service needs at least one minister.")

这是我的要求:

    {
    "service_id": 1,
    "church_id": 1,
    "speakers": [1,2]
    }

这是我的回复:

   {
    "message": {
        "speakers": "Every service needs at least one minister."
    }
}

无论出于何种原因,它都不会将[1,2]读入列表...

我尝试过:

  • type = list 我的错误:参见上文
  • 水nar 我的错误: TypeError: init ()得到了意外的关键字参数'水nar'
  • Type = int 我的错误:“ TypeError:'int'对象不可迭代”

1 个答案:

答案 0 :(得分:0)

有两种方法可以通过 reqparse 为一个参数传递多个值来实现等效功能。使用 action= 关键字参数,action=splitaction=append

使用 split,您将传入一个逗号分隔的字符串,它会执行类似 <<argument>>.split(',') 的操作,在解析时返回一个列表。

您的请求将如下所示:

 {
    "service_id": 1,
    "church_id": 1,
    "speakers": "1,2"
}

另一种选择是使用 append 操作,我认为您正在寻找它。它将保留类型 int(带有 type=int 关键字参数)。使用 append,示例中给出的扬声器参数将解析为列表。您将传递相同的列表作为参数:

 {
    "service_id": 1,
    "church_id": 1,
    "speakers": [1,2]
}

在命令行中,您将使用 append 参数多个参数,例如:

curl http://api.example.com -d "speakers=bob" -d "speakers=sue" -d "speakers=joe"

有关详细信息,请参阅 documentation