【问题标题】:How to pass class's self through a flask.Blueprint.route decorator?如何通过flask.Blueprint.route 装饰器传递类的自我?
【发布时间】:2012-01-01 01:09:14
【问题描述】:

我正在使用 Flask 和 Python 2.7 编写我的网站后端,但遇到了一些问题。我喜欢使用类来封装我的函数,它让我的事情变得整洁,并帮助我保持一切模块化。不过,我遇到的一个问题是用于路由的装饰器烧瓶不保留 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})

【问题讨论】:

  • 我怀疑您可能希望在 MethodView 中使用可插入视图。它变得有点难看,因为你不能在一个类中细化多条路线。但是您可以将模型类传递给视图类构造函数,然后每个路由都有一个返回模型类的句柄。这是一种分离视图/模型逻辑的方法。您可以创建一个包含每个视图的更高级别的类,因此您只需实例化一次。但它最终仍会回到添加 add_url_rule 以将所有内容链接回烧瓶。 flask.palletsprojects.com/en/1.1.x/views

标签: python decorator flask


【解决方案1】:

如果添加 self 则会出现错误,因为该方法与装饰器的函数的工作方式相同,并且烧瓶不期望具有第一个参数 self 的函数。

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

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

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

【讨论】:

  • 好的,谢谢。我希望除此之外还有另一种方法。但是,看起来没有,所以必须这样做。谢谢。
  • 链接已损坏。
  • 我修复了它,但实际上它只是一个指向蓝图的 add_url_rule 方法的链接,所以没什么特别的。
猜你喜欢
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
相关资源
最近更新 更多