Используйте асинхронный с торнадо и двигателем
Новичок в Python 3.5 и новый async
а также await
функции
Следующий код возвращает только будущий объект. Как я могу получить фактический элемент книги из базы данных и записать его в JSON? И как лучше всего использовать асинхронное ожидание вместе с торнадо?
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
1 ответ
Решение
Нет необходимости в "результате ()". Поскольку ваш метод "get" является нативной сопрограммой (он определен с помощью "async def"), то использование его с "await" означает, что вам уже возвращен результат:
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")
Однако вы также должны "дождаться" будущего в "get_book", чтобы решить его, прежде чем вернуться:
async def get_book(self, book_id):
book = await self.db.books.find_one({"_id":ObjectId(book_id)})
return book