Используйте асинхронный с торнадо и двигателем

Новичок в 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
Другие вопросы по тегам