Фьючерсы на 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)
Более сложные шаблоны кодирования не обязательно должны следовать этим правилам, но для начала следуйте этим основным правилам.
Для получения дополнительной информации о вызове сопрограмм из сопрограмм см. Рефакторинг сопрограмм Торнадо.