Day5 --- Flask-RESTful请求响应与SQLAlchemy基础

昨日回顾

  • 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()

总结:

  1. 导入RequestParser类,并实例化
  2. 向RequestParser对象中添加验证参数
  3. 使用parse_args()方法启动检验处理
  4. 通过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’)
  • 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,
}


# 视图类
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值