跳到主要内容

响应序列化

前言

响应序列化(Marshalling)用于控制接口返回的字段:通过 fields 定义模型,配合 @api.marshal_with 过滤输出、生成 Swagger 文档。

基本用法

from collections import OrderedDict

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

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

model = api.model(
"Model",
{
"task": fields.String,
"uri": fields.Url("todo_ep"), # 自动生成指向指定 endpoint 的 URL
},
)


class TodoDao:
def __init__(self, todo_id, task):
self.todo_id = todo_id
self.task = task
self.status = "active" # 不在模型中,不会输出


@api.route("/todo")
class Todo(Resource):
@api.marshal_with(model)
def get(self, **kwargs):
return TodoDao(todo_id="my_todo", task="Remember the milk")

fields 常用类型:

类型说明
fields.String字符串
fields.Integer整型
fields.Float浮点型
fields.Boolean布尔型
fields.DateTime日期时间
fields.List(cls_or_instance)列表
fields.Nested(model)嵌套模型
fields.Url(endpoint)URL(根据 endpoint 反查)
fields.Raw任意对象

常用参数:

fields.String(required=True, description="任务内容")
fields.Integer(readonly=True, description="只读字段不会出现在请求体中")
fields.List(fields.String, description="标签列表")

列表与嵌套

user_model = api.model(
"User",
{
"id": fields.Integer,
"username": fields.String,
},
)

article_model = api.model(
"Article",
{
"id": fields.Integer,
"title": fields.String,
"author": fields.Nested(user_model),
"tags": fields.List(fields.String),
},
)


@api.route("/articles")
class ArticleList(Resource):
@api.marshal_list_with(article_model)
def get(self):
return [
{
"id": 1,
"title": "Flask 笔记",
"author": {"id": 1, "username": "zhangsan"},
"tags": ["flask", "python"],
}
]

参考