2013-05-04 1 views
5

Ich spiele mit Tornado und Mongodb, mit dem asynchronen Treibermotor. Wenn Sie mit Rückrufen arbeiten, ist alles in Ordnung. Dann entdeckte ich die Möglichkeit motor.Op oder tornado.gen.Task verwenden nur eine Anforderung in einer Funktion auszuführen:Wie DB-Anfrage (die Ausbeute verwendet) in eine andere Funktion verschieben?

So wird diese Arbeit:

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

Aber ich möchte diese Datenbank verschieben Anfrage in einer eigenen Funktion in einem anderen Modul. Das Problem ist, dass ich nicht wirklich verstehe, wie der Ertrag hier funktioniert (obwohl ich eine Menge Fragen über den Ertrag gelesen habe). Also das ist, was ich versucht, aber es funktioniert nicht:

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

Und das Gespräch in eine andere Funktion:

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

Wenn ich untersuchen mit 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 

jede Hilfe dankbar , Vielen Dank.

Antwort

4

Ich fand einen anderen Weg, dies zu tun, dank this post, die von tornado.gen.Return verwendet. Ich muss noch in meiner Hauptfunktion nachgeben, aber die Coroutine ist einfach.

Hier ist mein Code jetzt:

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

Und der Anruf in einer anderen Funktion:

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