如何通过flask.Blueprint.route修饰器传递类本身?

2022-04-07 00:00:00 python flask decorator

问题描述

我正在使用Flask和Python2.7编写我的网站的后端,遇到了一些问题。我喜欢使用类来封装我的函数,它使我的事情变得整洁,并帮助我保持一切模块化。然而,我遇到的一个问题是,用于布线的装饰者烧瓶不能保留自变量。我使用它来访问它所在的类的loadDb方法。请参见下面的内容。有谁知道为什么会发生这种情况,知道我如何解决这个问题,或者是否有办法解决这个问题?

class Test(object):
    blueprint = Blueprint("Test", __name__)
    def __init__(self, db_host, db_port):
        self.db_host = db_host
        self.db_port = db_port
    def loadDb(self):
        return Connection(self.db_host, self.db_port)
    @blueprint.route("/<var>")
    def testView(var): # adding self here gives me an error
        return render_template("base.html", myvar=self.loadDb().find({"id": var})

解决方案

如果添加self,则会出现错误,因为该方法的工作方式与装饰符的函数相同,而烧瓶不需要第一个参数为self的函数。

我们来看看route:https://github.com/pallets/flask/blob/master/src/flask/blueprints.py#L52

的代码 它使用几个参数调用self.add_url_rule(self是Blueprint),其中一个在函数中。您需要的是添加一个将方法绑定到Test(self.testView)实例的规则,而不是方法本身(Test.testview)。这很棘手,因为装饰符是在创建类时执行的,而不是在任何实例存在之前。

除了避免将您的视图作为类的方法外,我可以建议的解决方案是在Test的构造函数中称自己为blueprint.add_url_rule(即,在第一个点上Test的实例是已知的。

相关文章