2017-04-15 2 views
0

Newbie zu Python 3.5 und die neuen async und await FunktionenVerwenden Asynchron mit Tornado und Motor

Der folgende Code gibt nur dann eine Zukunft Objekt. Wie bekomme ich den aktuellen Buchartikel aus der Datenbank und schreibe ihn nach json? Und was ist die beste Vorgehensweise für die Verwendung von Async zusammen mit Motor-Tornado erwarten?

async def get(self, book_id=None): 
    if book_id: 
     book = await self.get_book(book_id) 
     self.write(json_util.dumps(book.result())) 
    else: 
     self.write("Need a book id") 

async def get_book(self, book_id): 
    book = self.db.books.find_one({"_id":ObjectId(book_id)}) 
    return book 

Antwort

1

Keine Notwendigkeit für "result()". Da Ihr „get“ Methode ist eine native Koroutine (es ist definiert mit „Asynchron-def“), dann mit „erwarten“ bedeutet unter Verwendung es, dass ein Ergebnis bereits an Sie zurückgegeben wird:

async def get(self, book_id=None): 
    if book_id: 
     # Correct: "await" resolves the Future. 
     book = await self.get_book(book_id) 
     # No resolve(): "book" is already resolved to a dict. 
     self.write(json_util.dumps(book)) 
    else: 
     self.write("Need a book id") 

Allerdings müssen Sie auch „erwarten "die Zukunft in" get_book ", um es vor der Rückkehr zu lösen:

async def get_book(self, book_id): 
    book = await self.db.books.find_one({"_id":ObjectId(book_id)}) 
    return book 
+0

Hallo Davis. Ich habe versucht, den obigen Code, aber Fehler: 'Objekt des Typs 'Zukunft' ist nicht JSON serializable ' – JSNoob

+0

Oh, ich habe einen Schritt in get_book verpasst. Ich habe meine Antwort aktualisiert. –