微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Flask-Restx 中返回嵌套的 json 响应

如何解决如何在 Flask-Restx 中返回嵌套的 json 响应

我正在尝试使用 Flask-RestX 制作一个可以显示这样的响应的 API,

{
  "id": 1,"msg": "How are things","score": 345,"additional": {
    "goal": 56,"title": "ASking how"
  }
}

当数据是这样的(就我而言,我不控制数据格式),

data = {
    "id":1,"msg":"How are things","goal": 56,"score":345,"title":"Asking how"
}

但是我用当前代码得到的响应是错误的,它显示空值

{
  "id": 1,"additional": {
    "goal": null,"title": null
  }
}

完整代码--

from flask import Flask
from flask_restx import Resource,Api,fields

app = Flask(__name__)
api = Api(app)

data = {
    "id":1,"title":"Asking how"
}

extra = api.model('Extra',{
    'goal': fields.Integer,'title': fields.String
    })

model = api.model('Model',{
    'id' : fields.Integer,'msg' : fields.String,'score': fields.Integer,'additional' : fields.nested(extra)
  })


@api.route('/hello')
class HelloWorld(Resource):
    @api.marshal_with(model)
    def get(self):
        return data

if __name__ == '__main__':
    app.run(debug=True,port=4000)

我对 Flask-RestX / Flask-RestPlus 完全陌生。请告诉我,如何在不更改数据格式本身的情况下实现这一点。

解决方法

根据上面的waynetech's comment,以下对我有用:

from flask import Flask
from flask_restx import Resource,Api,fields

app = Flask(__name__)
api = Api(app)

data = {
    "id":1,"msg":"How are things","score":345,"additional": {
        "goal": 56,"title": "Asking how",}
}

extra = api.model('Extra',{
    'goal': fields.Integer,'title': fields.String
    })

model = api.model('Model',{
    'id' : fields.Integer,'msg' : fields.String,'score': fields.Integer,'additional' : fields.Nested(extra)
  })


@api.route('/hello')
class HelloWorld(Resource):

    @api.marshal_with(model)
    def get(self):
        return data

    @api.marshal_with(model)
    def post(self):
        data = api.payload

        return data

if __name__ == '__main__':
    app.run(debug=True,port=4000)

这是我使用的快速测试脚本:

from pprint import pprint
import requests

payload = {
    "id": 1,"msg":"Test","title": "Test",}
}

url = 'http://127.0.0.1:4000/hello'
r = requests.post(url,json=payload)

if r.status_code == 200:
    print(r.status_code)
    pprint(r.json())
else:
    print("FAIL: ",r.status_code)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?