Flask框架学习笔记—Flask-RESTful的基本使用

文章目录

          • 1. 安装
          • 2. 初始化
          • 3. 资源(Resource)
          • 4. 数据格式化
            • 4.1 基本用法
            • 4.2 嵌套字典
            • 4.3 嵌套列表
            • 4.4 URL
          • 5. 参数解析

Flask-RESTful是一个用于快速创建RESTful API接口的Flask扩展,使用Flask-RESTful可以很快速方便地创建一个RESTful风格的接口应用程序

1. 安装

(1) 使用pip安装

pip install flask-restful

(2) 源码安装

git clone https://github.com/flask-restful/flask-restful.git

python setup.py develop
2. 初始化

创建Api对象并初始化

# 方式一
api = Api(app)
# 方式二
api = Api()
api.init_app(app)
3. 资源(Resource)

官方说法:资源(Resources)是构建在Flask可拔插视图之上,只要在你的资源(resource)上定义方法就能够容易地访问多个HTTP方法

可以将其理解为Django中的类视图

用法如下:

(1) 创建Resource实现类

# apis.py
from flask_restful import Resource

class HelloResource(Resource):
    def get(self):
        return 'this is a get request'

    def post(self):
        return 'this is a post request'

(2) 注册路由

# urls.py
from .apis import *
from .exts import api

api.add_resource(HelloResource, '/hello/')

当我们使用get请求方式请求时,会返回’this is a get request’,当我们使用post请求方式请求时,会返回’this is a post request’

4. 数据格式化

Flask-RESTful提供了fields模块和marshal_with()装饰器来格式化在响应中数据结构

4.1 基本用法

先有如下一个模型

# models.py
from .exts import db

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    age = db.Column(db.Integer, default=1)
    score = db.Column(db.Integer)

现在想要返回我们设计的数据结构,如下:

# apis.py
from flask_restful import Resource, fields, marshal_with
from App.models import User
# 使用字典进行定义返回给前端的数据格式
user_fields = {
    'msg': fields.String,
    # 很多时候你面向公众的字段名称是不同于内部的属性名。使用 attribute 可以配置这种映射
    'status': fields.Integer(attribute='code'),
    # 如果由于某种原因你的数据对象中并没有你定义的字段列表中的属性,你可以指定一个默认值而不是返回 None
    'default': fields.String(default='返回数据不存在该字段'),
    'name': fields.String,
    'age': fields.Integer,
    'score': fields.Integer,
}

class UserResource(Resource):
	# 定义好的格式user_fields通过装饰器进行使用
    @marshal_with(user_fields)
    def get(self):
        return {
            'code': 0,
            'msg': '例子',
            'filtered': '数据被过滤掉',
            'name': User.query.first().name,
            'age': User.query.first().age,
            'score': User.query.first().score,
        }

访问结果如下:
Flask框架学习笔记—Flask-RESTful的基本使用_第1张图片
数据格式化有如下特性:

  1. 默认返回的数据如果在预定义结构中不存在,数据会被自动过滤
  2. 如果返回的数据在预定义的结构中存在,数据会正常返回
  3. 如果返回的数据比预定义结构中的字段少,预定义的字段会呈现一个默认值
4.2 嵌套字典
from flask_restful import Resource, fields, marshal_with
from App.models import User

user_fields = {
    'name': fields.String,
    'age': fields.Integer,
    'score': fields.Integer,
}
resource_fields = {
    'code': fields.Integer,
    'msg': fields.String,
    # Nested构造函数把字段的字典作为子字段来呈现
    'data': fields.Nested(user_fields),
}

class UserResource(Resource):
    @marshal_with(resource_fields)
    def get(self):
        return {
            'code': 0,
            'msg': '例子',
            'data': User.query.first()
        }

结果如下:
Flask框架学习笔记—Flask-RESTful的基本使用_第2张图片

4.3 嵌套列表
from flask_restful import Resource, fields, marshal_with
from App.models import User

user_fields = {
    'name': fields.String,
    'age': fields.Integer,
    'score': fields.Integer,
}
resource_fields = {
    'code': fields.Integer,
    'msg': fields.String,
    # 使用fields.List可以使之嵌套列表
    'data': fields.List(fields.Nested(user_fields)),
}

class UserResource(Resource):
    @marshal_with(resource_fields)
    def get(self):
        return {
            'code': 0,
            'msg': '例子',
            'data': User.query.all()
        }

结果如下:
Flask框架学习笔记—Flask-RESTful的基本使用_第3张图片

4.4 URL

Flask-RESTful包含一个特别的字段fields.Url,将当前数据的操作api暴露出来,根据提供的url和唯一标识进行数据操作

from flask_restful import Resource, fields, marshal_with

resource_fields = {
    'code': fields.Integer,
    'msg': fields.String,
    'url': fields.Url('url', absolute=True),
}

class UserResource(Resource):
    @marshal_with(resource_fields)
    def get(self):
        return {
            'code': 0,
            'msg': '例子',
        }

需要在add_resource()中提供对应的endpoint

api.add_resource(UserResource, '/user/', endpoint='url')

结果如下:
Flask框架学习笔记—Flask-RESTful的基本使用_第4张图片

5. 参数解析

Flask-RESTful内置了支持验证请求数据,解析客户端提交过来的参数

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

from flask_restful import Resource, reqparse

# 参数转换器
parser = reqparse.RequestParser()
# 添加required=True,使之成为一个必需的参数
parser.add_argument('name', type=str, required=True)
# 如果你指定了help参数的值,在解析的时候当类型错误被触发的时候,它将会被作为错误信息给呈现出来。
# 如果你没有指定help信息的话,默认行为是返回类型错误本身的信息。
parser.add_argument('score', type=int, help='score的类型是int')
parser.add_argument('age', type=int)
# 添加action='append',使之一个键可以有多个值
parser.add_argument('like', type=str, action='append')
# 使用location参数可以指定解析参数的位置,flask.Request中任何变量都能被使用
parser.add_argument('sessionid', type=str, location='cookies')

class UserResource(Resource):
    def get(self):
        args = parser.parse_args()
        name = args.get('name')
        score = args.get('score')
        age = args.get('age')
        like = args.get('like')
        sessionid = args.get('sessionid')
        return {
            'name': name,
            'score': score,
            'age': age,
            'like': like,
            'sessionid': sessionid,
        }

结果如下:
Flask框架学习笔记—Flask-RESTful的基本使用_第5张图片
当name参数没有给时,如下:
Flask框架学习笔记—Flask-RESTful的基本使用_第6张图片
score参数类型错误时,会显示help的内容
Flask框架学习笔记—Flask-RESTful的基本使用_第7张图片

你可能感兴趣的:(Flask)