【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')
相关推荐
belldeep1 天前
python:backtrader 使用指南
python·backtrader·量化回测
R.lin1 天前
Spring AI Alibaba 1.1 正式发布!
java·后端·spring
程序员阿明1 天前
spring security 6的知识点总结
java·后端·spring
Dxy12393102161 天前
Python的正则表达式如何做数据校验
开发语言·python·正则表达式
Daily Mirror1 天前
Day38 MLP神经网络的训练
python
yaoh.wang1 天前
力扣(LeetCode) 66: 加一 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
running up1 天前
Spring Bean生命周期- BeanDefinition 加载与 BeanFactoryPostProcessor BeanPostProcessor
java·后端·spring
云上漫步者1 天前
深度实战:Rust交叉编译适配OpenHarmony PC——unicode_width完整适配案例
开发语言·后端·rust·harmonyos
田姐姐tmner1 天前
Python 全面语法指南
开发语言·python
white-persist1 天前
【攻防世界】reverse | simple-check-100 详细题解 WP
c语言·开发语言·汇编·数据结构·c++·python·算法