我正在使用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的实例是已知的.