文章目录
昨日回顾
- Flask上下文对象分为几类?
- Flask为什么设计蓝图?
- 在flask中如何创建一个RESTful风格的api?
- 如何给类中的方法添加装饰器?
今日内容
- Flask-RESTful中请求的处理
- Flask-RESTful中响应的处理
- marshal序列化数据
- 定制json数据格式
- ORM与SQLAlchemy
- 单表数据的增删改查
1. 请求解析
1.1 RequestParser处理请求
Flask-RESTful提供RequestParser类,用来解析request对象,获取请求的参数。
简单实例
,测试/index/?id=5
# 1. 从请求中获取id参数
from flask import Flask
from flask_restful import Api, Resource
from flask_restful.reqparse import RequestParser
app = Flask(__name__)
api = Api(app)
# 视图类
class Index(Resource):
def get(self):
# 构建RequestParser()对象
parser = RequestParser()
# 添加验证参数id
parser.add_argument('id')
# 启动检验处理
args = parser.parse_args()
# args 类字典对象
return '参数ID的值为: {}'.format(args['id'])
# 添加路由(局部)
api.add_resource(Index, '/index/')
if __name__ == '__main__':
app.run()
总结:
- 导入RequestParser类,并实例化
- 向RequestParser对象中添加验证参数
- 使用parse_args()方法启动检验处理
- 通过args.id或args[‘id’]的方法获取参数
1.2 参数详解
parser.add_argument()方法的使用
参数:
-
required: 是否必传,默认值为False
- True: 必传, 若无则校验失败,响应400
- False: 非必传,未传时,取出值为None
-
help: 参数检验错误时返回的错误描述信息
-
action: 多个同名参数的处理方式
- action=‘store’: 保留出现的第一个, 默认
- action=‘append’: 以列表追加保存所有同名参数的值
-
type: 参数匹配的数据类型,可以使用python的标准数据类型str、int,也可使用Flask-RESTful提供的检验方法,还可以自己定义
- 标准类型: str或int
rp.add_argument(‘a’, type=int, required=True, help=‘missing a param’, action=‘append’)
- 标准类型: str或int
-
location: 参数应该在请求中的位置
-
请求体中
parser.add_argument(‘name’, type=int, location=‘form’) -
查询参数中
parser.add_argument(‘PageSize’, type=int, location=‘args’) -
请求头中
parser.add_argument(‘User-Agent’, location=‘headers’) -
cookie中
parser.add_argument(‘session_id’, location=‘cookies’) -
json数据中
parser.add_argument(‘user_id’, location=‘json’) -
文件上传
parser.add_argument(‘picture’, location=‘files’) -
指定多处
parser.add_argument(‘text’, location=[‘headers’, ‘json’])
-
1.3 处理请求案例
请求地址:/users/scores/?uid=123&hobby=shopping&hobby=movie
请求方法:GET
请求头:Authorization-> jwt token
# 定义视图
class TestResource(Resource):
def get(self):
parser = RequestParser()
parser.add_argument("uid", type=int, required=True, location="args", help="缺少用户id")
parser.add_argument("hobby", type=str, required=True, location="args", action="append")
parser.add_argument("Authorization", type=str, required=True, location="headers")
# 解析验证参数
args = parser.parse_args()
print("参数类型:", args, type(args))
return "解析的参数%s" % args.get("id")
2. 返回响应
主要有两方面:
- 序列化数据
- marshal_with 装饰器序列化
- marshal() 方法序列化
- 定制 JSON 格式
2.1 序列化数据:
序列化数据
Flask-RESTful 提供了marshal工具,将数据对象序列化为字典数据,返回响应。
1. marshal_with装饰器
,序列化输出数据
# 1. 使用marshal_with装饰器
from flask import Flask
from flask_restful import Api, Resource
from flask_restful import fields, marshal_with
app = Flask(__name__)
api = Api(app)
# 定义模型类
class User(object):
def __init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
# 序列化的字段
resource_fields = {
'name': fields.String,
'age': fields.Integer,
"height": fields.Float,
}
# 视图类