• Flask类视图和RESTful


    五、Flask类视图和RESTful

    1. Flask-RESTful

    I. 基本使用

    • 安装

      pip install flask-restful
      
      • 1
    • 创建Resource实现类(通常在App包下的apis.py中)

      from flask import jsonify
      from flask_restful import Resource
      
      
      # 类视图 :CBV  class base view
      # 视图函数 :FBV function base view
      
      class HelloResource(Resource):
          def get(self):
              return jsonify({'msg': 'get请求'})
      
          def post(self):
              return jsonify({'msg': 'post请求'})
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    • 创建api对象并注册路由

      # 方式一:创建并初始化 exts.py
      api = Api(app)
      
      # 方式二:创建之后初始化,在初始化插件中 exts.py
      api = Api()
      api.init_app(app)
      
      # 注册路由  urls.py
      # urls.py 路由文件
      from .apis import *
      from .exts import api
      
      api.add_resource(HelloResource, '/hello/')
      
      # 注意在 __init__.py中需要导入urls.py,否则没有执行路由
      from .urls import *
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

    II. 字段格式化

    使用方法:

    • fields进行定义
    • marshal_with进行使用

    特性

    • 显示我们设计的数据结构
    • 默认返回的数据如果在预定义结构中不存在,数据会被自动过滤
    • 如果返回的数据在预定义的结构中存在,数据会正常返回
    • 如果返回的数据比预定义结构中的字段少,预定义的字段会呈现一个默认值,未设置默认值,默认为null

    使用

    • 定义字段输出fields
      使用字典进行定义
      常用都是基本类型:StringInteger

      # 字段格式化:定义返回给前端的数据格式
      ret_fields = {
          'status': fields.Integer,
          'msg': fields.String,
          # 'data': fields.String,  # 不返回data字段
          'like': fields.String(default='ball'),  # 不定义默认值,默认值则为null
          'like2': fields.String,  # 默认值则为null
          'data2': fields.String(attribute='data'),  # 内部属性名为data,返回出去为data2,即使用是data值
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 定义好的格式通过装饰器进行使用
      @marshal_with(需要返回的数据格式),return返回字典就ok了

      class UserResource(Resource):
          @marshal_with(ret_fields)
          def get(self):
              return {
                  'status': 1,
                  'msg': 'ok',
                  'data': 'python'
              }
              
              
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 级联数据,嵌套字典,Nested

      user_fields = {
          # 'id': fields.Integer,
          'name': fields.String,
          'age': fields.Integer,
      }
      ret_fields2 = {
          'status': fields.Integer,
          'msg': fields.String,
          # User对象
          'data': fields.Nested(user_fields)
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 嵌套列表

      user_fields2 = {
          # 'id': fields.Integer,
          'name': fields.String,
          'age': fields.Integer,
      }
      ret_fields3 = {
          'status': fields.Integer,
          'msg': fields.String,
          # User对象
          'data': fields.List(fields.Nested(user_fields2))
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • URL:连接字段

      • 就是将当前数据的操作api暴露出来
      • 根据提供的url和唯一标识进行数据操作
      # 格式化字段
      user_fields = {
          'name': fields.String,
          # 路径匹配,在add_resource中也需要设置endpoint='id'
          'url': fields.Url(endpoint='id', absolute=True)
      }
      
      # 在add_resource中提供对应的endpoint
      api.add_resource(UserResource, '/user/', endpoint='id')
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    III. 参数解析

    可以不通过request.formrequest.args获取参数,而是通过reqparse.RequestParser来解析

    # 参数转换器
    parser = reqparse.RequestParser()
    parser.add_argument('name', type=str, required=True, help='name是必须的参数')  # 必需参数
    parser.add_argument('age', type=int, action='append')  # 可以有多个age,为数组
    parser.add_argument('key', type=str, location='cookies')  # 可以有多个age,为数组
    
    
    class User4Resource(Resource):
        def get(self):
            args = parser.parse_args()
            name = args.get('name')
            age = args.get('age')
            key = args.get('key')
            return {
                'name': name,
                'age': age,
                'key': key
            }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    接口压力测试 jmeter--增强篇(二)
    爬虫入门教程:爬虫概述
    2022年一级建造师考试什么时候才能报名?
    el-date-picker 禁用时分秒选择(包括禁用下拉框展示)
    黑马程序员2023新版JavaWeb企业开发全流程学习笔记(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)
    Python 关于加密和解密
    无胁科技-TVD每日漏洞情报-2022-11-3
    Java 关键字:synchronized详解
    HarmonyOS(鸿蒙系统)物联网开发教程——环境搭建
    任天堂开发全新独立VR设备,或为下一代主机?将提供混合现实体验
  • 原文地址:https://blog.csdn.net/weixin_44959506/article/details/136378065