首页 > 解决方案 > 在 flask_restplus RequestParser 中添加多个 json 字段

问题描述

我想要expect一个 request.json 看起来像这样的请求:

{
  "app_name": "app",
  "model_name": "model"
}

我创建了以下解析器:

parser = reqparse.RequestParser()
parser.add_argument('app_name', location='json', required=True)
parser.add_argument('model_name',  location='json', required=True)

并将解析器用作:

class ModelList(Resource):
    @api.expect(parser)
    def get(self):
    """Get all matching model records"""
    ....

这在服务中显示为:

在此处输入图像描述

但是当我尝试这个时,我的请求被翻译如下:

在此处输入图像描述

我希望请求看起来像:

curl -X GET "http://localhost:5000/model" -H  "accept: application/json" -H  "Content-Type: application/json" -d '{"app_name": "test","model_name": "affinity"}'

并不是:

curl -X GET "http://localhost:5000/model" -H  "accept: application/json" -H  "Content-Type: application/json" -d "affinity"

我究竟做错了什么?

标签: pythonflaskflask-restplus

解决方案


TypeError: HEAD 或 GET 请求不能有正文。

请参阅此 SO 问题,了解为什么它不能(不应该)有一个:HTTP GET with request body

要修复,请删除location='json'或指定location='args'

parser = reqparse.RequestParser()
parser.add_argument('app_name', required=True)
parser.add_argument('model_name', required=True)
parser = reqparse.RequestParser()
parser.add_argument('app_name', location='args', required=True)
parser.add_argument('model_name', location='args', required=True)

两者都会让 Swagger 知道在查询字符串中发送参数,并且解析器知道去那里查看。


推荐阅读