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
        }
相关推荐
codists21 分钟前
《Django 5 By Example》阅读笔记:p339-p358
python·django
檀越剑指大厂25 分钟前
【Python系列】异步 Web 服务器
服务器·前端·python
m0_6760995843 分钟前
数据结构--创建链表--Python
数据结构·python·链表
搬砖的果果1 小时前
HTTP代理是什么,主要用来干嘛?
网络·python·网络协议·tcp/ip·http
白初&1 小时前
文件上传代码分析
java·c++·python·php·代码审计
菜鸟小贤贤1 小时前
pyhton+yaml+pytest+allure框架封装-全局变量渲染
python·macos·pytest·接口自动化·jinja2
赛丽曼2 小时前
Python中的简单爬虫
爬虫·python
CODE_RabbitV2 小时前
Python + 深度学习从 0 到 1(00 / 99)
开发语言·python·深度学习
微凉的衣柜3 小时前
在 PyTorch 中进行推理时,为什么 `model.eval()` 和 `torch.no_grad()` 需要同时使用?
人工智能·pytorch·python
int WINGsssss3 小时前
使用系统内NCCL环境重新编译Pytorch
人工智能·pytorch·python