Как передать себя классу через колбу.Blueprint.route? - PullRequest
4 голосов
/ 18 ноября 2011

Я пишу бэкэнд моего сайта, используя 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})

1 Ответ

6 голосов
/ 18 ноября 2011

Ошибка при добавлении self, потому что метод работает так же, как функция для декоратора, и колба не ожидает функцию с первым аргументом self.

Давайте посмотрим на код route: https://github.com/mitsuhiko/flask/blob/master/flask/blueprints.py#L155

Он вызывает self.add_url_rule (self является Blueprint) с несколькими аргументами, один из которых находится в функции. Вам нужно добавить правило с методом, привязанным к экземпляру Test (self.testView), а не сам метод (Test.testview). Это сложно, потому что декоратор выполняется при создании класса, прежде чем какой-либо экземпляр будет существовать.

Решение, которое я могу предложить, не говоря уже о том, чтобы избегать представления ваших представлений в качестве методов класса, заключается в том, чтобы называть себя blueprint.add_url_rule в конструкторе Test (т. Е. В первой точке экземпляр Test известны.

...