字段格式化的意思就是对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')