如何在其他函数中移动db请求(使用yield)?

yby*_*ode 5 python tornado mongodb tornado-motor

我正在玩龙卷风和mongodb,使用异步驱动电机.使用回调时一切都很好.然后我发现有可能使用motor.Op或tornado.gen.Task来仅在一个函数中执行请求:

这是有效的:

class Contact_handler(Main_handler):

    @web.asynchronous
    @gen.coroutine
    def get(self, other_id):

        event = events.Event_send_contact_request(self.user_id)
        result = yield motor.Op(db.users.update,
                     {'_id': ObjectId(other_id)},
                     {'$push': {'evts': event.data}}
                    )

        self.finish("ok")
Run Code Online (Sandbox Code Playgroud)

但我想将此数据库请求在其自己的函数中移动到另一个模块中.问题是我真的不明白产量在这里是如何工作的(尽管我读了很多关于产量的问题).所以这就是我尝试过的,但它不起作用:

#------ file views.py -------------

class Contact_handler(Main_handler):

    def get(self, other_id):

        event = events.Event_send_contact_request(self.user_id)
        result = model.push_event_to_user(other_id, event)

        self.finish("ok")
Run Code Online (Sandbox Code Playgroud)

而另一个函数的调用:

#------ file model.py -------------

@gen.coroutine
def push_event_to_user(user_id, event):

    ## Ajout de la demande dans les events du demandé:
    yield motor.Op(db.users.update,
                     {'_id': ObjectId(user_id)},
                     {'$push': {'evts': event}}
                    )
Run Code Online (Sandbox Code Playgroud)

如果我用pdb调查:

(Pdb) l
157             event = events.Event_send_contact_request(self.user_id)
158             result = model.push_event_to_user(other_id, event)
159             
160             import pdb; pdb.set_trace()
161             
162  ->         self.finish("ok")
163         

(Pdb) result
<tornado.concurrent.TracebackFuture object at 0xa334b8c>
(Pdb) result.result()
*** Exception: DummyFuture does not support blocking for results
Run Code Online (Sandbox Code Playgroud)

任何帮助表示感谢,谢谢.

yby*_*ode 4

我找到了另一种方法来做到这一点,这要归功于这篇使用tornado.gen.Return的帖子。我仍然需要在主函数中让出,但协程很简单。

\n\n

现在这是我的代码:

\n\n
#------ file views.py -------------\n\n@web.asynchronous\n@gen.coroutine\nclass Contact_handler(Main_handler):\n\n    def get(self, other_id):\n\n        event = events.Event_send_contact_request(self.user_id)\n        result = yield model.push_event_to_user(other_id, event)\n\n        self.finish("ok")\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及另一个函数中的调用:

\n\n
#------ file model.py -------------\n\n@gen.coroutine\ndef push_event_to_user(user_id, event):\n\n    ## Ajout de la demande dans les events du demand\xc3\xa9:\n    result = yield motor.Op(db.users.update,\n                            {\'_id\': ObjectId(user_id)},\n                            {\'$push\': {\'evts\': event}}\n                           )\n    raise gen.Return(result)\n
Run Code Online (Sandbox Code Playgroud)\n