Фьючерсы на Python: Как мне получить JSON от будущего объекта в Торнадо?

Это post обработчик:

handler.py

from imports import logic

@gen.coroutine
def post(self):
    data = self.request.body.decode('utf-8')
    params = json.loads(data)
    model_id= params['model_id']
    logic.begin(model_id)

logic объект импортируется из import.py, где он создается из импортируемого класса Logic

import.py:

import Models
import Logic

class Persist(object):
    def getModel(self, model_id):
        model = Models.findByModelId(model_id)
        return model


persist = Persist()
logic = Logic(persist)

logic.py

class Logic(object):
    def __init__(self, persist):
        self._persist = persist

    def begin(self, model_id):
         model = self._persist.get_model(model_id)
         print ("Model from persist : ")
         print (model)

get_model метод использует Models который делает запрос к БД и возвращает будущий объект:

model.py:

from motorengine.document import Document

class Models(Document):
    name = StringField(required=True)

def findByModelId(model_id):
    return Models.objects.filter(_id=ObjectId(model_id)).find_all()

Это печатает будущий объект в консоли:

<tornado.concurrent.Future object at 0x7fbb147047b8>

Как я могу преобразовать его в JSON?

1 ответ

Разрешить Future в фактическую стоимость, yield это внутри сопрограммы:

@gen.coroutine
def begin(self, model_id):
     model = yield self._persist.get_model(model_id)
     print ("Model from persist : ")
     print (model)

Любая функция, которая вызывает сопрограмму, должна быть сопрограммой, и она должна yield возвращаемое значение сопрограммы, чтобы получить его возвращаемое значение:

@gen.coroutine
def post(self):
    data = self.request.body.decode('utf-8')
    params = json.loads(data)
    model_id = params['model_id']
    model = yield logic.begin(model_id)
    print(model)

Более сложные шаблоны кодирования не обязательно должны следовать этим правилам, но для начала следуйте этим основным правилам.

Для получения дополнительной информации о вызове сопрограмм из сопрограмм см. Рефакторинг сопрограмм Торнадо.

Другие вопросы по тегам