如何通过flask.Blueprint.route修饰器传递类本身? [英] How to pass class's self through a flask.Blueprint.route decorator?

查看:30
本文介绍了如何通过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的函数。

我们来看看routehttps://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的实例是已知的。

这篇关于如何通过flask.Blueprint.route修饰器传递类本身?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆