2016-05-16 2 views
2

Я использую Python и Tornado для создания базовых приложений с помощью элемента слайдера jquery. Моя цель заключается в том, что когда пользователи взаимодействуют со слайдером, ему будет отправлено значение функции python, и результат будет отображаться в консоли python. Мои custom.js является:tornado.gen.BadYieldError: дал неизвестный объект None

$(function() { 
$("#slider-range-max").slider({ 
    min : 0, 
    max : 100, 
    slide : function(event, ui) { 
     $("#amount").val(ui.value); 
     ajax({ 
       url: "/action", 
       data: {parameter:ui.value}, 
      }); 
     }, 
    }); 
    $("#amount").val($("#slider-range-max").slider("value")); 
}); 

main.py

define("port", default=8888, help="run on the given port", type=int) 
class Application(tornado.web.Application): 
    def __init__(self): 
    handlers = [ 
     (r"/", AuxHandler), 
     (r"/action", MainHandler) 
    ] 
    settings = { 
     "template_path": Settings.TEMPLATE_PATH, 
     "static_path": Settings.STATIC_PATH, 
    } 

    tornado.web.Application.__init__(self, handlers, **settings) 

class AuxHandler(tornado.web.RequestHandler): 
    def get(self): 
    self.render("index.html") 

class MainHandler(tornado.web.RequestHandler): 
    @asynchronous 
    @tornado.gen.coroutine 
    def get(self): 
    speed = int(self.get_argument("parameter")) 
    p=P() 
    if speed > 1: 
     p.startApp(speed) 
    if speed<1: 
     p.stopApp() 

def main(): 
    tornado.options.parse_command_line() 
    http_server = tornado.httpserver.HTTPServer(Application()) 
    http_server.listen(options.port) 
    tornado.ioloop.IOLoop.instance().start() 
if __name__ == "__main__": 
    main() 

и p.py

@tornado.gen.coroutine 
def startApp(self,speed): 
    x= yield print(speed) 
    while True: 
     yield x 

В консоли я получаю это:

12 
[I 160516 12:47:19 web:1946] 304 GET /action?parameter=12 (::1) 0.00ms 
13 
[I 160516 12:47:19 web:1946] 304 GET /action?parameter=13 (::1) 15.60ms 
14 
[E 160516 12:47:19 concurrent:336] Future <tornado.concurrent.Future object at 0x02FAA7D0> exception was never retrieved: Traceback (most recent call last): 
    File "C:\Users\home\AppData\Local\Programs\Python\Python35-32\lib\site-packages\tornado\gen.py", line 1014, in run 
    yielded = self.gen.throw(*exc_info) 
    File "E:\work\python\Example2\p.py", line 11, in startApp 
    x= yield print(speed) 
    File "C:\Users\home\AppData\Local\Programs\Python\Python35-32\lib\site-packages\tornado\gen.py", line 1008, in run 
    value = future.result() 
    File "C:\Users\home\AppData\Local\Programs\Python\Python35-32\lib\site-packages\tornado\concurrent.py", line 232, in result 
    raise_exc_info(self._exc_info) 
    File "<string>", line 3, in raise_exc_info 
    File "C:\Users\home\AppData\Local\Programs\Python\Python35-32\lib\site-packages\tornado\gen.py", line 1090, in handle_yield 
    self.future = convert_yielded(yielded) 
    File "C:\Users\home\AppData\Local\Programs\Python\Python35-32\lib\functools.py", line 743, in wrapper 
    return dispatch(args[0].__class__)(*args, **kw) 
    File "C:\Users\home\AppData\Local\Programs\Python\Python35-32\lib\site-packages\tornado\gen.py", line 1222, in convert_yielded 
    raise BadYieldError("yielded unknown object %r" % (yielded,)) 
tornado.gen.BadYieldError: yielded unknown object None 

Я надеваю `т знать, как справиться с этим", дал неизвестный ob ject None "или если мой подход верен. Любая идея будет очень полезной.

+0

Вы пытаетесь дать 'печать()', который возвращает 'None' – kwarunek

+0

при перемещении ползунка в браузере, он будет необходимо отправить значение скорости для печати(). если я делаю без урока (в p.py), будет напечатано это значение (скорость) навсегда, но с выходом, для первых значений не будет получена ошибка, но через некоторое время я получил ошибки. –

ответ

1

Исключение составляет от yield print(speed). print возвращает None, и вы не можете дать None. Вы можете давать только фьючерсы и похожие ожидаемые объекты, как правило, когда вы получаете результат вызова сопрограммы. См. Refactoring Tornado Coroutines для руководства по вызову сопрограмм.

Если вы хотите вывести значение скорости, просто сделать это:

def startApp(self, speed): 
    print(speed) 
+0

Я использовал выход, потому что метод get (в main.py), который вызывается ajax, запустит функцию p.startApp (скорость), зависящую от скорости (значение). Когда пользователь перемещает ползунок в браузере слева направо (или справа налево), для каждого нового значения будет вызываться p.startApp (скорость). То, что я не понимаю, почему ошибка появится через некоторое время, так как я начинаю перемещать слайдер. –