【问题标题】:how to set up an Inherited MethodView in Flask to do CRUD operations on sqlalchemy models如何在 Flask 中设置 Inherited MethodView 以对 sqlalchemy 模型进行 CRUD 操作
【发布时间】:2017-04-09 19:07:28
【问题描述】:

为了避免为我的模型编写 api 方法视图。我希望创造一种更优雅的继承方式来做到这一点。

class ModelCrudAPI(MethodView):

    def __init__(self, model):
      self.model = model

    def get(self):
        store_id = request.args.get("store_id", None, int)
        waiters = self.model.query.filter_by(store_id=store_id).all()

        if waiters is None or store_id is None:
            return jsonify({'items': [], 'store_id': store_id}), 204

        # TODO: change personnel_data to list
        else:
            items = []
            for waiter in waiters:
                items.append(row2dict(waiter))
            return jsonify({"items": items, 'store_id': store_id})

我之前在这个问题中设置了类似的继承。 previous question about inheritance and decorators in methodviews

请注意,我想将 sqlalcdhemy 模型传递给我的班级。

第一个场景

class Test(ModelCrudAPI):

    def __init__(self, model):
        super(Test, self).__init__(model)

api.add_url_rule("/test", view_func=Test(MYMODEL).as_view("test"), methods=['GET','POST','PUT','DELETE'])

错误:

flask debuger :TypeError: __init__() takes exactly 2 arguments (1 given)

第二种情况

class Test(ModelCrudAPI):

    def __init__(self, MYMODEL):
        super(Test, self).__init__(MYMODEL)

api.add_url_rule("/test", view_func=Test.as_view("test"), methods=['GET','POST','PUT','DELETE'])

错误:

flask debuger :TypeError: __init__() takes exactly 2 arguments (1 given)

我真的很感激任何帮助。这将清理我的代码。

编辑此作品

class Test(ModelCrudAPI):
    def __init__(self):
        ModelCrudAPI.__init__(self, Personnel)


api.add_url_rule("/test", view_func=Test.as_view("test"), methods=['GET','POST','PUT','DELETE'])

【问题讨论】:

    标签: python inheritance flask sqlalchemy crud


    【解决方案1】:

    as_view 是一个 classmethod,它将提供给它的参数转发给类的构造函数。所以你所要做的就是将你的模型作为 second 参数传递给as_view:

    class Test(ModelCrudAPI):
        def __init__(self, model):
            super(Test, self).__init__(model)
    
    api.add_url_rule("/test", view_func=Test.as_view("test", MYMODEL), methods=['GET','POST','PUT','DELETE'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 2014-01-02
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2023-02-05
      相关资源
      最近更新 更多