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.