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
        }
相关推荐
努力的家伙是不讨厌的31 分钟前
解析json导出csv或者直接入库
开发语言·python·json
云空1 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
神仙别闹1 小时前
基于tensorflow和flask的本地图片库web图片搜索引擎
前端·flask·tensorflow
凤枭香2 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺2 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森2 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、2 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen3 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空3 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
霍格沃兹测试开发学社测试人社区3 小时前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask