我正在使用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})
答案 0 :(得分:5)
如果添加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
已知。