【PythonWeb开发】Flask-RESTful字段格式化

字段格式化的意思就是对api接口返回的响应做出规范。

具体的思想是,先定义一个格式化输出样板fields,然后在类视图中的视图方法上加marshal_with装饰器使得格式化生效。这样做的有什么特别的用处吗?特性:

  • 显示出我们设计的数据结构

  • 默认返回的数据如果不在预定义的结构fields中,数据会被自动过滤

  • 如果返回的数据在预定义结构fields中存在,数据才会正常返回

  • 如果返回的数据字段比预定义结构fields中定义的字段要少,那么缺少的字段会呈现出一个默认值

一、定义字段输出格式

使用字典来进行定义,一般API接口的返回结果都是一个JSON对象。通常使用的数据类型是:String、Integer。使用字段格式化必须要导入from flask_restful import fields

python 复制代码
from flask_restful import fields

# 格式化字段
user_fields = {
    'msg': fields.String,
    'status': fields.Integer,
    'data': fields.String(attribute='private_data'),
    'default_data': fields.String(default='1')
}

二、视图类中使用规定格式输出

将定义好的格式,通过装饰器进行使用。

@marshal_with(需要返回的数据格式)

return {返回字典}

(1)简单使用

python 复制代码
class Users(Resource):
    
    @marshal_with(user_fields)
    def get(self):
        return {
            'msg': 'failed',
            'data': '没有数据',
            'age': '22',
            'private_data': '表中数据'
        }

(2)嵌套字典

return返回的一般是一个字典,如果我在字典中的某个字段也是字典,那么就需要用到Nested方法来进行字典嵌套字典。这样做的目的是对子一级的数据也做规范化响应输出。

python 复制代码
# 子一级,格式化字段
usermodel_fields = {
    'id': fields.Integer,
    'name': fields.String,
}

# 返回的格式化字段
user_fields = {
    'msg': fields.String(default='ok'),
    'status': fields.Integer(default=1),
    'data': fields.Nested(usermodel_fields)  # 字典中嵌套字典,要用Nested()方法指明
}

(3)嵌套列表

返回的字段结构允许嵌套列表,也就是字典中嵌套列表,列表里面还可以是字典。那么就需要用到List方法。目的是一样的,也是相对更深层的数据格式做规范。

python 复制代码
usermodel_fields = {
    'id': fields.Integer,
    'name': fields.String
}

user_fields = {
    'status': fields.String(default=1),
    'msg': fields.String,
    'data': fields.List(fields.Nested(usermodel_fields))
}

(4)嵌套URL

在返回的响应字段中,带有url字段,这种做法也经常使用,用在做api的跳转。一般是根据提供的url和唯一标识进行数据操作。

python 复制代码
usermodel_fields = {
    'id': fields.Integer,
    'name': fields.String,
    # 'id'是标识符,用来告诉这个url你想暴露显示哪一个路由
    'url': fields.Url('id', absolute=True)  # absolute是否显示绝对路径
}

# 既然给了标识符'id',那么在路由中就需要指明
api.add_resource(User, '/user', endpoint='id')
相关推荐
喵手1 天前
Python爬虫实战:构建招聘会数据采集系统 - requests+lxml 实战企业名单爬取与智能分析!
爬虫·python·爬虫实战·requests·lxml·零基础python爬虫教学·招聘会数据采集
专注VB编程开发20年1 天前
python图片验证码识别selenium爬虫--超级鹰实现自动登录,滑块,点击
数据库·python·mysql
iFeng的小屋1 天前
【2026最新当当网爬虫分享】用Python爬取千本日本相关图书,自动分析价格分布!
开发语言·爬虫·python
民乐团扒谱机1 天前
【微科普】3D 演奏蠕虫分析图:解码音乐表演情感的 “可视化语言”
python·可视化·音乐·3d图·3d蠕虫
芝士爱知识a1 天前
AlphaGBM 深度解析:下一代基于 AI 与蒙特卡洛的智能期权分析平台
数据结构·人工智能·python·股票·alphagbm·ai 驱动的智能期权分析·期权
52Hz1181 天前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode
喵手1 天前
Python爬虫实战:网页截图归档完全指南 - 构建生产级页面存证与历史回溯系统!
爬虫·python·爬虫实战·零基础python爬虫教学·网页截图归档·历史回溯·生产级方案
Charlie_lll1 天前
力扣解题-[3379]转换数组
数据结构·后端·算法·leetcode
张3蜂1 天前
Python 四大 Web 框架对比解析:FastAPI、Django、Flask 与 Tornado
前端·python·fastapi