如何在 Flask-Restx 中 return 嵌套 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"
}
但是我用当前代码得到的响应是错误的,它显示空值
{
"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 完全陌生。请告诉我,如何在不更改数据格式本身的情况下实现这一点。
根据上面的,以下对我有用:
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)
我正在尝试使用 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,
"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 完全陌生。请告诉我,如何在不更改数据格式本身的情况下实现这一点。
根据上面的
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)