响应序列化
前言
响应序列化(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"],
}
]