(1) 使用pip安装
pip install flask-restful
(2) 源码安装
git clone https://github.com/flask-restful/flask-restful.git
python setup.py develop
创建Api对象并初始化
# 方式一
api = Api(app)
# 方式二
api = Api()
api.init_app(app)
官方说法:资源(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’
Flask-RESTful提供了fields模块和marshal_with()装饰器来格式化在响应中数据结构
先有如下一个模型
# 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,
}
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()
}
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-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-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,
}