tornado 6, module ‘tornado.web’ has no attribute ‘asynchronous’

Posted in :

tornado異步時發現的錯誤,查了一下,原來tornado6以後就棄用了tornado.web.asynchronous這種寫法了。

Any method or function decorated with gen.coroutine should be called using a yield statement. Otherwise the coroutine won’t run.

So, you need to yield the predict method when you’re calling it.

@gen.coroutine
def post(self):
    ...
    yield self.predict('mod1')

class GenAsyncHandler(RequestHandler):
    @gen.coroutine
    def get(self):
        http_client = AsyncHTTPClient()
        response = yield http_client.fetch("http://example.com")
        do_something_with_response(response)
        self.render("template.html")

或者tornado降級回到5.1.1就沒問題了。

官文文檔:

https://www.tornadoweb.org/en/branch5.1/web.html#tornado.web.asynchronous

Changed in version 3.1: The ability to use @gen.coroutine without @asynchronous.

Changed in version 4.3: Returning anything but None or a yieldable object from a method decorated with @asynchronous is an error. Such return values were previously ignored silently.

Deprecated since version 5.1: This decorator is deprecated and will be removed in Tornado 6.0. Use coroutines instead.
pip uninstall tornado
pip install tornado==5.1.1

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *