Питон / Торнадо - вызов метода класса

Учитывая этот простой код, где я объявляю класс и функции внутри него. В основном я пытаюсь вызвать функцию, но вызов не производится. Я не получаю никакой ошибки, но если я поставлю печать, чтобы узнать, произошел ли звонок, ничего не происходит.

модели

class Balance(Document):
    gross_balance = FloatField(required=True, min_value=0, default=0)

    @classmethod
    def createBalance(cls, gross_balance):
        result = yield Balance.objects.create(gross_balance = gross_balance)
        result.save()
    @classmethod
    def sayHi(cls):
        print "Hi there"

главный

from models import Balance

class CreateBalanceHandler(tornado.web.RequestHandler):

@tornado.gen.coroutine
def post(self):
    gross_balance = self.get_argument('gross_balance')
    Balance.createBalance(gross_balance)
    Balance.sayHi()
    self.redirect('/query/{}'.format(gross_balance))

Что я делаю неправильно? Функция sayHi показывает свою печать, но с createBalance реакции нет.

1 ответ

Решение

Декорировать createBalance с gen.coroutine запустить его на ioloop. Чтобы дождаться создания баланса, вызовите его как yield Balance.createBalance() в RequestHandler

модели

class Balance(Document):
    gross_balance = FloatField(required=True, min_value=0, default=0)

    # classmethod must be the most outter decorator (as well as staticmethod)

    @classmethod
    @tornado.gen.coroutine
    def createBalance(cls, gross_balance):
        result = yield Balance.objects.create(gross_balance = gross_balance)
        # AFAIR save returns future and also should be yielded
        # yield. result.save()
        result.save()

    @classmethod
    def sayHi(cls):
        print "Hi there"

главный

from models import Balance

class CreateBalanceHandler(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def post(self):
        gross_balance = self.get_argument('gross_balance')
        yield Balance.createBalance(gross_balance)
        Balance.sayHi()
        self.redirect('/query/{}'.format(gross_balance))

Примечание: как я уже упоминал в комментарии фрагмента, в motorengine Document.save возвращается Future и, вероятно, вы хотите yield это также, чтобы ждать, пока это не закончилось.

Другие вопросы по тегам