Flask类视图和RESTful

五、Flask类视图和RESTful

1. Flask-RESTful

I. 基本使用

  • 安装

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

    python 复制代码
    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请求'})
  • 创建api对象并注册路由

    python 复制代码
    # 方式一:创建并初始化 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 *

II. 字段格式化

使用方法:

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

特性

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

使用

  • 定义字段输出fields

    使用字典进行定义

    常用都是基本类型:StringInteger

    python 复制代码
    # 字段格式化:定义返回给前端的数据格式
    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值
    }
  • 定义好的格式通过装饰器进行使用
    @marshal_with(需要返回的数据格式),return返回字典就ok了

    python 复制代码
    class UserResource(Resource):
        @marshal_with(ret_fields)
        def get(self):
            return {
                'status': 1,
                'msg': 'ok',
                'data': 'python'
            }
            
            
  • 级联数据,嵌套字典,Nested

    python 复制代码
    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)
    }
  • 嵌套列表

    python 复制代码
    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))
    }
  • URL:连接字段

    • 就是将当前数据的操作api暴露出来
    • 根据提供的url和唯一标识进行数据操作
    python 复制代码
    # 格式化字段
    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')

III. 参数解析

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

python 复制代码
# 参数转换器
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
        }
相关推荐
小杨4044 分钟前
python入门系列十五(asyncio)
人工智能·python·pycharm
爱学习的capoo6 分钟前
对应列表数据的分割和分组
python·pandas
点燃大海15 分钟前
MySQL表结构导出(Excel)
java·数据库·python·mysql·spring
Hole_up22 分钟前
蓝桥杯真题-分糖果-题解
python·算法·职场和发展·蓝桥杯
databook24 分钟前
『Plotly实战指南』--散点图绘制进阶篇
python·数据分析·数据可视化
Tttian6221 小时前
Python办公自动化(4)对PPT&邮箱的操作
开发语言·python
pk_xz1234561 小时前
python加载训练好的模型并进行叶片实例分割预测
开发语言·python
独好紫罗兰1 小时前
洛谷题单3-P1075 [NOIP 2012 普及组] 质因数分解-python-流程图重构
开发语言·python·算法
胖哥真不错2 小时前
Python实现NOA星雀优化算法优化随机森林回归模型项目实战
python·机器学习·项目实战·随机森林回归模型·noa星雀优化算法
编程咕咕gu-2 小时前
从零开始玩python--python版植物大战僵尸来袭
开发语言·python·python基础·pygame·python教程