我正在玩龙卷风和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")
@H_502_11@但我想将此数据库请求在其自己的函数中移动到另一个模块中.问题是我真的不明白产量在这里是如何工作的(尽管我读了很多关于产量的问题).
所以这就是我尝试过的,但它不起作用:#------ 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")
@H_502_11@#------ 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}} )
@H_502_11@如果我用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
@H_502_11@ 任何帮助表示感谢,谢谢.
最佳答案
我找到了另一种方法,这要归功于使用tornado.gen.Return的this post.我仍然需要在我的主函数中产生,但是协程很简单.
这是我现在的代码:
#------ file views.py -------------
@web.asynchronous
@gen.coroutine
class Contact_handler(Main_handler):
def get(self,other_id):
event = events.Event_send_contact_request(self.user_id)
result = yield model.push_event_to_user(other_id,event):
## Ajout de la demande dans les events du demandé:
result = yield motor.Op(db.users.update,{'$push': {'evts': event}}
)
raise gen.Return(result)
@H_502_11@