2016-06-06 1 views
2

я следующий код:Торнадо: асинхронные конечные точки

class StackOverflowHandler(tornado.web.RequestHandler): 

    def get(self, look_up_pattern): 
     url = "https://api.stackexchange.com/2.2/search?order=desc&sort=votes&intitle=%s&site=stackoverflow" 
     response = self.async_get(url) 
     print(response) 
     self.write(response) 

    @gen.coroutine 
    def async_get(self, url): 
     link = httpclient.AsyncHTTPClient() 
     request = httpclient.HTTPRequest(url) 
     response = yield link.fetch(request) 
     data = response.body.decode('utf-8') 
     data = json.loads(data) 
     return data 

application = tornado.web.Application([ 
    (r"/search/(.*)", StackOverflowHandler), 
]) 

Тип, который возвращается из async_get является tornado.concurrent.Future.

Исключение:

TypeError: write() only accepts bytes, unicode, and dict objects 

Я новичок асинхронного программирования, пожалуйста, укажите мне мою ошибку.

ответ

3

С async_get is coroutine возвращает Future объект. Чтобы получить «реальные» результаты, будущее должно быть разрешено - его нужно уступить. Более того, обработчик get должен быть оформлен как асинхронный, а также

class StackOverflowHandler(tornado.web.RequestHandler): 

    @gen.coroutine 
    def get(self, look_up_pattern): 
     url = "https://api.stackexchange.com/2.2/search?order=desc&sort=votes&intitle=%s&site=stackoverflow" 
     response = yield self.async_get(url) 
     print(response) 
     self.write(response) 

    @gen.coroutine 
    def async_get(self, url): 
     link = httpclient.AsyncHTTPClient() 
     request = httpclient.HTTPRequest(url) 
     response = yield link.fetch(request) 
     data = response.body.decode('utf-8') 
     data = json.loads(data) 
     return data 

 Смежные вопросы

  • Нет связанных вопросов^_^