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

Sma*_*boy 4 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})
Run Code Online (Sandbox Code Playgroud)

mad*_*jar 7

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

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

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

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

  • 好的,谢谢。我希望除此之外还有另一种方法可以解决这个问题。不过好像没有,所以必须这样做。谢谢。 (2认同)