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

2024-01-01

我正在使用 Flask 和 Python 2.7 编写网站的后端,但遇到了一些问题。我喜欢使用类来封装我的函数,它使我的事情变得整洁并帮助我保持一切模块化。不过,我遇到的一个问题是,flask 用于路由的装饰器不保留 self 变量。我使用它来访问其所在类的 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因为该方法的工作方式与装饰器的函数相同,并且 Flask 并不期望具有第一个参数的函数self.

我们看一下代码route : https://github.com/pallets/flask/blob/master/src/flask/blueprints.py#L52 https://github.com/pallets/flask/blob/master/src/flask/blueprints.py#L52

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过flask.Blueprint.route装饰器传递类的自身? 的相关文章

随机推荐