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

前端之家收集整理的这篇文章主要介绍了如何在其他函数中移动db请求(使用yield)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

这是有效的:

  1. class Contact_handler(Main_handler):
  2. @web.asynchronous
  3. @gen.coroutine
  4. def get(self,other_id):
  5. event = events.Event_send_contact_request(self.user_id)
  6. result = yield motor.Op(db.users.update,{'_id': ObjectId(other_id)},{'$push': {'evts': event.data}}
  7. )
  8. self.finish("ok")

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

  1. #------ file views.py -------------
  2. class Contact_handler(Main_handler):
  3. def get(self,other_id):
  4. event = events.Event_send_contact_request(self.user_id)
  5. result = model.push_event_to_user(other_id,event)
  6. self.finish("ok")

而另一个函数调用

  1. #------ file model.py -------------
  2. @gen.coroutine
  3. def push_event_to_user(user_id,event):
  4. ## Ajout de la demande dans les events du demandé:
  5. yield motor.Op(db.users.update,{'_id': ObjectId(user_id)},{'$push': {'evts': event}}
  6. )

如果我用pdb调查:

  1. (Pdb) l
  2. 157 event = events.Event_send_contact_request(self.user_id)
  3. 158 result = model.push_event_to_user(other_id,event)
  4. 159
  5. 160 import pdb; pdb.set_trace()
  6. 161
  7. 162 -> self.finish("ok")
  8. 163
  9. (Pdb) result

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

最佳答案
我找到了另一种方法,这要归功于使用tornado.gen.Returnthis post.我仍然需要在我的主函数中产生,但是协程很简单.

这是我现在的代码

  1. #------ file views.py -------------
  2. @web.asynchronous
  3. @gen.coroutine
  4. class Contact_handler(Main_handler):
  5. def get(self,other_id):
  6. event = events.Event_send_contact_request(self.user_id)
  7. result = yield model.push_event_to_user(other_id,event):
  8. ## Ajout de la demande dans les events du demandé:
  9. result = yield motor.Op(db.users.update,{'$push': {'evts': event}}
  10. )
  11. raise gen.Return(result)

猜你在找的Python相关文章