2016-05-05 15 views
0

Ich benutze RethinkDB mit Tornado mit einem asynchronen Ansatz. Basiert auf meinem Datenmodell in RethinkDB, nachdem ich einen Datensatz für meine topic Tabelle eingefügt habe, muss ich auch einen neuen Datensatz in user_to_topic Tabelle aktualisieren/einfügen. Hier ist die grundlegende Einrichtung meines Post-Request-Handlers.Wie man einen Wert aus der tornado.ioloop.IOLoop Instanz zurückgibt add_future Methode

class TopicHandler(tornado.web.RequestHandler): 
    def get(self): 
    pass 

    @gen.coroutine 
    def post(self, *args, **kwargs): 
     # to establish databse connection 
     connection = rth.connect(host='localhost', port=00000, db=DATABASE_NAME) 
     # Thread the connection 
     threaded_conn = yield connection 

     title = self.get_body_argument('topic_title') 
     # insert into table 
     new_topic_record = rth.table('Topic').insert({ 
     'title': topic_title, 
    }, conflict="error", 
     durability="hard").run(threaded_conn) 

    # {TODO} for now assume the result is always written successfully 
    io_loop = ioloop.IOLoop.instance() 
    # I want to return my generated_keys here 
    io_loop.add_future(new_topic_record, self.return_written_record_id) 
    # do stuff with the generated_keys here, how do I get those keys 

    def return_written_record_id(self, f): 
    _result = f.result() 
    return _result['generated_keys'] 

nachdem der Einfügevorgang abgeschlossen ist, das Objekt mit Future Rückergebnis von RethinkDB Einfügevorgang durch Future.result() Verfahren, das I-ID des neuen Datensatzes unter Verwendung von generated_keys Attribut Ergebnis abrufen kann. Entsprechend Tornadodocument kann ich Sachen mit dem Ergebnis in meiner Rückruffunktion, return_written_record_id tun. Natürlich kann ich alle anderen Datenbankoperationen innerhalb meiner return_written_record_id Funktion tun, aber ist es möglich, alle Ids zu meiner post Funktion zurückzugeben? Oder muss man Coroutine im Tornado benutzen?

Jeder Vorschlag wird geschätzt. Vielen Dank!

Antwort

1

einfach tun:

result = yield new_topic_record 

Jedes Mal, wenn Sie eine Zukunft in einem Koroutine ergeben, Tornado pausiert die Koroutine, bis die Zukunft auf einen Wert oder eine Ausnahme behoben ist. Dann nimmt Tornado die Coroutine wieder auf, indem er den Wert eingibt oder eine Ausnahme beim Ausdruck "yield" auslöst.

Weitere Informationen finden Sie unter Refactoring Tornado Coroutines.