如何通过flask.Blueprint.route修饰器传递类本身?
问题描述
我正在使用Flask和Python2.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
的函数。
我们来看看route
:https://github.com/pallets/flask/blob/master/src/flask/blueprints.py#L52
self.add_url_rule
(self是Blueprint
),其中一个在函数中。您需要的是添加一个将方法绑定到Test
(self.testView
)实例的规则,而不是方法本身(Test.testview
)。这很棘手,因为装饰符是在创建类时执行的,而不是在任何实例存在之前。
除了避免将您的视图作为类的方法外,我可以建议的解决方案是在Test
的构造函数中称自己为blueprint.add_url_rule
(即,在第一个点上Test
的实例是已知的。
相关文章