项目使用了flaskappbuilder这个第三方包,目前项目是前后端不分离的,视图直接继承ModelView,CRUD开发方便快捷;但是前后端不分离有很多缺点,打算把项目改成前后端分离的项目。一直在纠结要不要换掉flaskappbuilder使用flask restful, 如果换掉flaskappbuilder的话,整个项目重构工作量太大。看了flaskappbuiler的源码之后,惊叹它的强大,它提供了很多视图函数,其中就包括提供api接口的视图函数RestCRUDView。
flaskappbuilder视图继承关系
BaseView <— BaseModelView <— BaseCRUDView <— RestCRUDView <— ModelView
ModelView视图提供前后端不分离的接口,RestCRUDView提供类rest 风格的接口
举例
RestCRUDView的获取列表的接口,接口中包含分页,过滤,排序
class RestCRUDView(BaseCRUDView):
"""
This class view exposes REST method for CRUD operations on you models
"""
# 获取列表接口
@expose_api(name='read', url='/api/read', methods=['GET'])
@has_access_api
@permission_name('list')
def api_read(self):
"""
"""
# Get arguments for ordering
if get_order_args().get(self.__class__.__name__):
order_column, order_direction = get_order_args().get(self.__class__.__name__) # 获取排序的字段和生序还是降序
else:
order_column, order_direction = '', ''
page = get_page_args().get(self.__class__.__name__)
page_size = get_page_size_args().get(self.__class__.__name__) # 获取分页参数
get_filter_args(self._filters) # 获取过滤参数
joined_filters = self._filters.get_joined_filters(self._base_filters)
count, lst = self.datamodel.query(joined_filters, order_column, order_direction, page=page, page_size=page_size)
result = self.datamodel.get_values_json(lst, self.list_columns) # 获取列表
pks = self.datamodel.get_keys(lst)
ret_json = jsonify(label_columns=self._label_columns_json(),
list_columns=self.list_columns,
order_columns=self.order_columns,
page=page,
page_size=page_size,
count=count,
modelview_name=self.__class__.__name__,
pks=pks,
result=result)
response = make_response(ret_json, 200)
response.headers['Content-Type'] = "application/json"
return response
使用方式:
GET http://127.0.0.1:8088/slicemodelview/api/read?page_SliceModelView=1&psize_SliceModelView=25
返回结果
这个接口的缺点是分页参数固定,但是可以重新实现分页参数获取这部分。视图函数继承RestCRUDView之后,基本的增删改查接口我们就不用自己实现了,只需要实现其他的接口,大大节省了重构的时间,减少了重构的工作量。