Питон / Торнадо - вызов метода класса
Учитывая этот простой код, где я объявляю класс и функции внутри него. В основном я пытаюсь вызвать функцию, но вызов не производится. Я не получаю никакой ошибки, но если я поставлю печать, чтобы узнать, произошел ли звонок, ничего не происходит.
модели
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
это также, чтобы ждать, пока это не закончилось.