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
        }
相关推荐
鸽芷咕39 分钟前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
子午1 小时前
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
人工智能·python·cnn
风等雨归期1 小时前
【python】【绘制小程序】动态爱心绘制
开发语言·python·小程序
yanglamei19621 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
Adolf_19931 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
冯宝宝^1 小时前
基于mongodb+flask(Python)+vue的实验室器材管理系统
vue.js·python·flask
friklogff1 小时前
【无标题】云端之C#:全面解析6种云服务提供商的SDK
开发语言·flask·c#
叫我:松哥1 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
Eiceblue2 小时前
Python 复制Excel 中的行、列、单元格
开发语言·python·excel
NLP工程化2 小时前
对 Python 中 GIL 的理解
python·gil