我目前正在开发一个CRUD应用程序,最终将跨越一个相当大的数据库,我想用最佳实践来解决它。
当我设计Flask View时,我目前将所有功能放在一个视图中。
@userBlueprint.route('/<string:lang>/user', methods=['GET'])
@userBlueprint.route('/<string:lang>/user/<string:function>', methods=['GET', 'POST'])
@userBlueprint.route('/<string:lang>/user/<string:function>/<int:id>', methods=['GET', 'POST'])
def userView(lang=None, id=None, function=None):
if function == None:
pass
elif function == 'delete':
pass
else:
if function == 'update':
pass
elif function == 'new':
pass
您可以想象,在考虑所有数据库功能(关系,选择字段选择生成,多租户控制等)时,此视图会变得相当大。
完成同样任务的另一种方法是构建五个这样的视图。
@userBlueprint.route('/<string:lang>/user', methods=['GET'])
def getUsers(lang=None):
pass
@userBlueprint.route('/<string:lang>/user', methods=['POST'])
def newUsers(lang=None):
pass
@userBlueprint.route('/<string:lang>/user/<int:id>', methods=['GET'])
def getUser(lang=None, id=None):
pass
@userBlueprint.route('/<string:lang>/user/<int:id>', methods=['POST'])
def deleteUser(lang=None, id=None):
pass
@userBlueprint.route('/<string:lang>/user/<int:id>', methods=['POST'])
def modifyUser(lang=None, id=None):
pass
这里的缺点当然是我需要输入大量重复的代码。
是否考虑了任何一种方法&#34;最佳实践&#34;如果没有,是否有第三种选择?
答案 0 :(得分:3)
内置的仪器是烧瓶method views,它们专门用于帮助您在不同的功能中实现不同的对象操作:
class UserAPI(MethodView):
def get(self, user_id):
if user_id is None:
# return a list of users
pass
else:
# expose a single user
pass
def post(self):
# create a new user
pass
def delete(self, user_id):
# delete a single user
pass
def put(self, user_id):
# update a single user
pass
user_view = UserAPI.as_view('user_api')
app.add_url_rule('<string:lang>/user/', defaults={'user_id': None}, view_func=user_view, methods=['GET'])
app.add_url_rule('<string:lang>/user/', view_func=user_view, methods=['POST'])
app.add_url_rule('<string:lang>/user/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE'])
为不同的表实现多个视图将非常容易:从中创建BaseAPI方法视图和子类。对于不同的表,获取/更新/删除对象可能类似。
您还可以在flask-admin包中查看CRUD的实现。它的路线按这种方式分组:
<string:tablename>/
(GET) - 显示对象列表<string:tablename>/new/
(GET,POST) - 显示创建对象的表单/创建对象<string:tablename>/edit/
(GET,POST) - 显示用于编辑对象的表单/更新对象<string:tablename>/delete/
(POST) - 删除对象