flask插件系列之flask_restful设计API
Posted 天宇之游
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask插件系列之flask_restful设计API相关的知识,希望对你有一定的参考价值。
前言
flask框架默认的路由和视图函数映射规则是通过在视图函数上直接添加路由装饰器来实现的,这使得路由和视图函数的对应关系变得清晰,但对于统一的API开发就变得不怎么美妙了,尤其是当路由接口足够多的时候,可读性会变差。flask_restful可以使我们像Django那样统一在一个地方设计所有的API规则。
flask_restful
安装
pip install flask_restful
初始化
# extensions.py
from flask_restful import Api
flask_api = Api()
# __init__.py
from flask import Flask, current_app
from exsentions flask_api
app = Flask(__name__)
app.config[‘SECRET_KEY‘] = ‘123‘
flask_api.init_app(app)
添加蓝图和api
# rest/__init___.py
from flask import Blueprint
from exsentions import flask_api
# 创建蓝图
rest = Blueprint("rest", __name__)
__all__ = ["rest","api"]
# 加载蓝图所对应的视图上下文
from .api import *
# 设计路由
flask_api.add_resource(ToDo1,‘/restful‘)
flask_api.add_resource(Todo,"/restful1")
# rest/api.py
from flask_restful import Resource, fields, marshal_with, reqparse
parser = reqparse.RequestParser()
class ToDo1(Resource):
def get(self):
# 拷贝一个对象备用
new_parser = parser.copy()
# 添加请求参数和它的验证规则
new_parser.add_argument(‘n‘, type=int, help=‘Rate to charge for this resource,{error_msg}‘)
# 进行验证,得到通过验证后的字典或者抛出400错误
args = new_parser.parse_args(strict=True)
print(args)
return "OK"
def post(self):
pass
def put(self):
pass
class Todo(Resource):
def post(self):
new_parser = parser.copy()
new_parser.add_argument(‘n‘, type=int, help=‘Rate to charge for this resource,{error_msg}‘)
new_parser.add_argument(‘c‘, type=dict, help=‘Rate to charge for this resource,{error_msg}‘)
args = new_parser.parse_args(strict=True)
print(args)
return "OK"
说明
将路由的设计统一在一个模块中,使用类的方式控制视图。
主要方法
- flask_api.add_resource():添加路由
该方法创建了RULE对象,并将其添加到Maps对象中,
参数:
resource:视图类
urls:路由,可以多个指向一个视图类
endpoint:视图函数的标志,默认用类名替代
请求数据验证
# 创建一个RequestParser,其会拦截request上下文,但是其内部存储的参数列表对所有的请求都是同一个,因此针对每个请求都需要一个新的对象
parser = reqparse.RequestParser()
# 拷贝一个对象备用,参数列表是空的
new_parser = parser.copy()
# 向参数列表添加请求参数和它的验证规则,每个参数单独添加
new_parser.add_argument(‘n‘, type=int, help=‘Rate to charge for this resource,{error_msg}‘)
new_parser.add_argument(‘c‘, type=dict, help=‘Rate to charge for this resource,{error_msg}‘)
# 进行验证,得到通过验证后的字典或者抛出400错误
args = new_parser.parse_args(strict=True)
- new_parser.add_argument()
# 该方法其实是创建了一个Argument对象,其参数对应了Argument的初始化参数
def __init__(self, name, default=None, dest=None, required=False,
ignore=False, type=text_type, location=(‘json‘, ‘values‘,),
choices=(), action=‘store‘, help=None, operators=(‘=‘,),
case_sensitive=True, store_missing=True, trim=False,
nullable=True):
self.name = name # 参数的名字
self.default = default # 如果没有该参数,其默认的值
self.dest = dest # name的别名
self.required = required # 参数是否可以省略
self.ignore = ignore # 是否忽略参数类型转换失败的情况,默认不忽略
self.location = location # 从请求对象中获取的参数类型
self.type = type # 转换的参数类型,默认转换成str,失败就报错
self.choices = choices # 参数的值的有限集合,不再其中就报错
self.action = action
self.help = help # 参数无效时可以返回的信息
self.case_sensitive = case_sensitive # 是否区分大小写,默认所有大写转换成小写
self.operators = operators
self.store_missing = store_missing # 缺少参数时是否加默认的值
self.trim = trim # 是否去除参数周围的空白
self.nullable = nullable # 是否允许参数使用空值
另外还有格式化返回数据结构,个人感觉并不是很好用,不述。
参考:
以上是关于flask插件系列之flask_restful设计API的主要内容,如果未能解决你的问题,请参考以下文章
七十七:flask.Restful之flask-Restful参数验证
发送带有承载令牌授权标头 (flask_restful + flask_jwt_extended) 的 GET 消息时出现“段不足”