2017-04-15 2 views
0

Débutant à Python 3.5 et les nouveaux async et await caractéristiquesUtilisez async avec une tornade et un moteur

Le code suivant renvoie uniquement un objet futur. Comment puis-je obtenir l'élément de livre réel de la base de données et l'écrire à JSON? Et quelle est la meilleure pratique pour l'utilisation d'async en attente avec motor-tornado?

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 

Répondre

1

Pas besoin de "résultat()". Étant donné que votre méthode « get » est un coroutine natif (il est défini par « async def »), puis l'utiliser avec « attendre » signifie qu'un résultat est déjà retourné:

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

Cependant vous devez également « attendre "l'avenir dans" get_book "afin de le résoudre avant de retourner:

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

Hi Davis. J'ai essayé le code ci-dessus mais j'ai eu une erreur: 'L'objet de type 'Future' n'est pas sérialisable JSON' – JSNoob

+0

Oh, j'ai raté une étape dans get_book. J'ai mis à jour ma réponse. –