1

我想将 Motorengine 用于我的 Tornado 应用程序。正如文档中给出的,这就是我应该如何制作 ODM

from motorengine.document import Document
from motorengine.fields import StringField, DateTimeField

class Article(Document):
    title = StringField(required=True)
    description = StringField(required=True)
    published_date = DateTimeField(auto_now_on_insert=True)

    new_title = "Better Title %s" % uuid4()

def create_article():
    Article.objects.create(
        title="Some Article",
        description="This is an article that really matters.",
        callback=handle_article_created
    )

def handle_article_created(article):
   article.title = new_title
   article.save(callback=handle_article_updated)

def handle_article_updated(article):
    Article.objects.find_all(callback=handle_articles_loaded)

def handle_articles_loaded(articles):
    assert len(articles) == 1
    assert articles[0].title == new_title
    articles[0].delete(callback=handle_article_deleted)

def handle_article_deleted(number_of_deleted_items):
    try:
        assert number_of_deleted_items == 1
    finally:
        io_loop.stop()

io_loop.add_timeout(1, create_article)
io_loop.start()

令人困惑的是,一旦创建实例,这是否会保持与数据库的一致连接?我想要对所有模型的数据库进行非阻塞 I/O 操作,所以如果它这样做不是问题。但是我不应该为用户模型实现它,我在验证时只会访问一次。是否有访问用户数据的正常方法?

另外,我不清楚一些事情:

  1. 最后两行(ioloop)到底在做什么?

  2. 我在单独的文件中声明不同的模型,我io_loop.start()是否每个文件都做一个?这是我觉得很奇怪的部分。

请帮帮我。谢谢。

4

1 回答 1

2

阅读 MotorEngine 的代码,在我看来,您对 MongoDB 执行的每项操作,例如Article.objects.create,都会检查一个MotorClient实例并在可能的情况下重用一个实例。这是连接被缓存并从缓存中查找的位置:

https://github.com/heynemann/motorengine/blob/master/motorengine/connection.py#L62

每个都MotorClient维护一个持久的 IOStream 池,因此您的问题的答案是肯定的。

IOLoop.start启动您的应用程序服务器。您应该在一个文件中调用一次。调用start永远运行,或者直到你终止进程。

add_timeout调用只是演示 MotorEngine 功能的一种方式,它会等待一秒钟然后调用create_article. 您不会在实际应用程序中做类似的事情;您可能会create_article直接调用 a RequestHandler,而不使用add_timeout.

于 2015-06-04T11:58:46.463 回答