【问题标题】:Python/Tornado - call to classmethodPython/Tornado - 调用类方法
【发布时间】:2016-05-09 15:29:20
【问题描述】:

给定这个简单的代码,我在其中声明了一个类和一个函数。我主要尝试调用该函数,但未进行调用。我没有收到任何错误,但如果我打印出来以了解呼叫是否发生,则没有任何反应。

型号

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 没有反应。

【问题讨论】:

  • 无法复制。发布minimal reproducible example
  • @VincentSavard 我发布了一个更完整的示例
  • 这是您的实际缩进,createBalance 在类主体之外?
  • 另外,我不熟悉龙卷风,但 Balance.createBalance(gross_balance) 调用只是创建一个协程,而不是执行它的任何代码。你应该yield from那个协程还是什么?

标签: python python-2.7 tornado class-method motorengine


【解决方案1】:

gen.coroutine 装饰createBalance 以在ioloop 上运行它。要等到余额被创建,像 yield Balance.createBalance() in 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))

注意:正如我在 sn-p 的评论中提到的,在 motorengine 中,Document.save 返回 Future 并且您可能也想 yield 它,等到它完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多