簡體   English   中英

如何在 Flask-Restx 中返回嵌套的 json 響應

[英]How to return a nested json response in Flask-Restx

我正在嘗試使用 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"
}

但是我用當前代碼得到的響應是錯誤的,它顯示了 null 值

{
  "id": 1,
  "msg": "How are things",
  "score": 345,
  "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,
    "msg":"How are things",
    "goal": 56,
    "score":345,
    "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的評論,以下內容對我有用:

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",
    "score":345,
    "additional": {
        "goal": 56,
        "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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM