2015-08-16 2 views
1

Это post обработчик:Фьючерсы на Python: Как получить json из будущего объекта в Tornado?

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 импортируется из imports.py, где его экземпляра из импортируемого класса Logic

imports.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?

ответ

2

Чтобы разрешить 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) 

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

Дополнительную информацию о вызове сопрограммы из сопрограмм см. В разделе Refactoring Tornado Coroutines.