gpt4 book ai didi

python - 如何通过 flask.Blueprint.route 装饰器传递类的 self ?

转载 作者:太空狗 更新时间:2023-10-30 02:34:28 26 4
gpt4 key购买 nike

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

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

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

关于python - 如何通过 flask.Blueprint.route 装饰器传递类的 self ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8179558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com