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


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,
        }

访问结果如下:
在这里插入图片描述
数据格式化有如下特性:

  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()
        }

结果如下:
在这里插入图片描述

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()
        }

结果如下:
在这里插入图片描述

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')

结果如下:
在这里插入图片描述

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,
        }

结果如下:
在这里插入图片描述
当name参数没有给时,如下:
在这里插入图片描述
score参数类型错误时,会显示help的内容
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Flask-RESTful` 是 Flask 的一个扩展,它使创建 RESTful API 变得更加容易。使用 Flask-RESTful,你可以使用 Python 类来定义资源(Resource),并使用 Flask 的路由系统来将 URL 映射到这些资源上。 Flask-RESTful 提供了一组类和方法来处理 HTTP 请求和响应,例如 `Resource`、`Api`、`reqparse` 等。其中,`Resource` 类表示一个 RESTful 资源,它封装了 HTTP 请求和响应的处理逻辑。`Api` 类表示整个 RESTful API,它可以将多个资源组合在一起,并将它们映射到 URL 上。`reqparse` 类用于解析和验证 HTTP 请求参数。 下面是一个简单的使用 Flask-RESTful 的示例: ``` from flask import Flask from flask_restful import Api, Resource, reqparse app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True) ``` 在上面的示例中,`HelloWorld` 类继承自 `Resource` 类,表示一个 RESTful 资源。`get()` 方法表示处理 HTTP GET 请求的逻辑,它返回一个 JSON 响应。`api.add_resource()` 方法将 `HelloWorld` 资源映射到根 URL 上。当用户访问根 URL 时,Flask-RESTful 将自动调用 `HelloWorld` 资源的 `get()` 方法,并返回 JSON 响应。 Flask-RESTful 还支持其他 HTTP 方法,例如 POST、PUT、DELETE 等。你可以根据实际需求定义不同的资源和方法,以创建一个完整的 RESTful API。 总之,Flask-RESTful 是一个非常方便的 Flask 扩展,可以帮助你轻松地创建 RESTful API,从而提供 Web 服务和数据接口。它提供了一组类和方法,使 HTTP 请求和响应的处理变得更加简单和易于维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值