如何通过flask.Blueprint.route装饰器传递类的自我?

时间:2011-11-18 08:20:31

标签: python decorator flask

我正在使用Flask和Python 2.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})

1 个答案:

答案 0 :(得分:5)

如果添加self则会出错,因为该方法与装饰器的功能相同,并且烧瓶不期望具有第一个参数self的函数。

让我们看一下route的代码:https://github.com/mitsuhiko/flask/blob/master/flask/blueprints.py#L155

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

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