有关Flask CRUD视图的最佳做法

问题描述 投票:1回答:1

我目前正在研究一个CRUD应用程序,该应用程序最终将跨越一个相当大的数据库,并且我想使用最佳实践进行研究。

在设计Flask视图时,我目前将所有功能都放在一个这样的视图中。

@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

可以想象,将所有数据库功能(关系,selectfield选择生成,多租户控件等)考虑在内时,此视图可能会变得很大。

完成此任务的另一种方法是建立五个这样的视图。

@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

当然,这里的缺点是我需要输入很多重复的代码。

两种方法都被视为“最佳实践”吗?如果不是,是否还有第三种选择?

python view flask crud
1个回答
3
投票

它的内置工具是flask 方法视图 ,它们专门设计用来帮助您在不同的函数中实现不同的对象动作:

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)-删除对象
© www.soinside.com 2019 - 2024. All rights reserved.