用Tornado保存MotorEngine实例

时间:2015-12-03 08:51:16

标签: python asynchronous tornado motorengine

我在使用Tornado处理程序保存MotorEngine实例时遇到问题。以下是为简洁起见而缩短的代码摘录。

如果我用motorengine替换mongoengine次导入,则会正确保存实例。

# model
from motorengine.document import Document
from motorengine.fields import *

class Test(Document):
    nameTest = StringField(required=True)
    numberTest = DecimalField(required=True)
    boolTest = BooleanField(required=True)

# handler
class TestHandler(BaseHandler):

    @tornado.gen.coroutine
    def post(self, *args, **kwargs):
        response = self._service.save_test()
        print(response)
        self.write('')
        self.finish()

# save method
from models import Test

def save_test(self):
        yield Test.objects.create(nameTest="foobar", boolTest=False, numberTest=123)

我的代码中是否有明显的错误?异步编程不是我的强项。

:编辑:

根据Ben的回答,这是可行的代码

# handler
@tornado.gen.coroutine
def post(self, *args, **kwargs):
    yield self._service.save_test()

# save method
@tornado.gen.coroutine
def save_test(self):
    yield Test.objects.create(nameTest="foobar", boolTest=False, numberTest=123)

1 个答案:

答案 0 :(得分:2)

save_test(以及以这种方式使用yield的任何函数)必须拥有@gen.coroutine装饰器,并且在post()中调用它(或任何其他协程)时你必须使用yield save_test()