python - 有关 Flask CRUD View 的最佳实践

标签 python view flask crud

我目前正在开发一个 CRUD 应用程序,该应用程序最终将跨越一个相当大的数据库,我希望使用最佳实践来实现它。

当我设计 Flask View 时,我目前将所有功能都放在一个 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

正如您可以想象的那样,当考虑到所有数据库功能(关系、选择字段选择生成、 Multi-Tenancy 控制等)时,此 View 可能会变得相当大。

完成相同任务的另一种方法是构建五个这样的 View 。

@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

这里的缺点当然是我需要输入大量重复的代码。

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

最佳答案

它的内置工具是flask 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'])

为不同的表实现多个 View 将非常容易:创建 BaseAPI 方法 View 并从中创建子类。对于不同的表,获取/更新/删除对象可能是相似的。

您还可以在 flask-admin 中查看 CRUD 的实现包裹。它的路线按如下方式分组:

  • <string:tablename>/ (GET) — 显示对象列表
  • <string:tablename>/new/ (GET, POST) — 显示用于创建对象的表单/创建对象
  • <string:tablename>/edit/ (GET, POST) - 显示用于编辑对象/更新对象的表单
  • <string:tablename>/delete/ (POST) - 删除对象

关于python - 有关 Flask CRUD View 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41606779/

相关文章:

python - 使用文本搭配计算 ngram 词频

javascript - redisClient.on ('message' 触发多个事件)

ios - Apple 是否违反了 iOS 8 上 MailboxContentViewCell.h 中的 MVC 规则?

Eclipse 在 View 中显示浏览器

python - wtforms SelectField 始终返回 None

python - 使用 pdb,如何运行程序并在遇到错误时暂停?

python - 可散列的,不可变的

iphone - viewdidunload 根本没有被调用

python - MongoEngine 改变数据库

python - 属性错误: 'Workbook' object has no attribute 'write'