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

我正在使用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})

解决方法:

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

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

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

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

上一篇:23.Python函数式编程 装饰器 详解


下一篇:‘@’python decorator用来做类似于java中的方法重写的东西?