五、Flask类视图和RESTful
1. Flask-RESTful
I. 基本使用
-
安装
shpip install flask-restful
-
创建
Resource
实现类(通常在App包下的apis.py
中)pythonfrom 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
使用字典进行定义
常用都是基本类型:
String
,Integer
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了pythonclass UserResource(Resource): @marshal_with(ret_fields) def get(self): return { 'status': 1, 'msg': 'ok', 'data': 'python' }
-
级联数据,嵌套字典,
Nested
pythonuser_fields = { # 'id': fields.Integer, 'name': fields.String, 'age': fields.Integer, } ret_fields2 = { 'status': fields.Integer, 'msg': fields.String, # User对象 'data': fields.Nested(user_fields) }
-
嵌套列表
pythonuser_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.form
或request.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
}