2013-05-04 5 views
5

मैं एसिंक्रोनस ड्राइवर मोटर के साथ, टॉरनाडो और मोंगोडब के साथ खेल रहा हूं। कॉलबैक के साथ काम करते समय सबकुछ ठीक है। तब मैं संभावना 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") 

लेकिन मैं इस डेटाबेस को ले जाना चाहते किसी अन्य मॉड्यूल में अपने स्वयं के फ़ंक्शन में अनुरोध करें। समस्या यह है कि मैं वास्तव में समझ नहीं पा रहा हूं कि उपज कैसे काम कर रही है (हालांकि मैं उपज के बारे में बहुत सारे प्रश्न पढ़ता हूं)। तो यह है कि मैं क्या करने की कोशिश की है, लेकिन यह काम नहीं कर रहा:

#------ 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") 

और एक और समारोह में कॉल:

#------ 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}} 
        ) 

मैं 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 

भी मदद की सराहना , धन्यवाद।

उत्तर

4

मुझे this post का उपयोग करने का एक और तरीका मिला, tornado.gen.Return का उपयोग करता है। मुझे अभी भी अपने मुख्य समारोह में उपज करने की आवश्यकता है, लेकिन कोरआउट सरल है।

#------ 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) 

     self.finish("ok") 

और एक और समारोह में कॉल:

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

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

    ## Ajout de la demande dans les events du demandé: 
    result = yield motor.Op(db.users.update, 
          {'_id': ObjectId(user_id)}, 
          {'$push': {'evts': event}} 
          ) 
    raise gen.Return(result) 

यहाँ अब मेरे कोड है

संबंधित मुद्दे

 संबंधित मुद्दे