What’s new in Tornado 6.0

Mar 1, 2019

Backwards-incompatible changes

  • Python 2.7 and 3.4 are no longer supported; the minimum supported Python version is 3.5.2.

  • APIs deprecated in Tornado 5.1 have been removed. This includes the tornado.stack_context module and most callback arguments throughout the package. All removed APIs emitted DeprecationWarning when used in Tornado 5.1, so running your application with the -Wd Python command-line flag or the environment variable PYTHONWARNINGS=d should tell you whether your application is ready to move to Tornado 6.0.

  • .WebSocketHandler.get is now a coroutine and must be called accordingly in any subclasses that override this method (but note that overriding get is not recommended; either prepare or open should be used instead).

General changes

  • Tornado now includes type annotations compatible with mypy. These annotations will be used when type-checking your application with mypy, and may be usable in editors and other tools.

  • Tornado now uses native coroutines internally, improving performance.


  • All callback arguments in this package have been removed. Use the coroutine interfaces instead.

  • The OAuthMixin._oauth_get_user method has been removed. Override _oauth_get_user_future instead.


  • The callback argument to run_on_executor has been removed.

  • return_future has been removed.


  • Some older portions of this module have been removed. This includes engine, YieldPoint, Callback, Wait, WaitAll, MultiYieldPoint, and Task.

  • Functions decorated with @gen.coroutine no longer accept callback arguments.


  • The behavior of raise_error=False has changed. Now only suppresses the errors raised due to completed responses with non-200 status codes (previously it suppressed all errors).

  • The callback argument to AsyncHTTPClient.fetch has been removed.


  • HTTPServerRequest.write has been removed. Use the methods of request.connection instead.

  • Unrecognized Content-Encoding values now log warnings only for content types that we would otherwise attempt to parse.


  • IOLoop.set_blocking_signal_threshold, IOLoop.set_blocking_log_threshold, IOLoop.log_stack, and IOLoop.handle_callback_exception have been removed.

  • Improved performance of IOLoop.add_callback.



  • Log files opened by this module are now explicitly set to UTF-8 encoding.


  • The results of getaddrinfo are now sorted by address family to avoid partial failures and deadlocks.


  • TornadoReactor and TwistedIOLoop have been removed.


  • The default HTTP client now supports the network_interface request argument to specify the source IP for the connection.

  • If a server returns a 3xx response code without a Location header, the response is raised or returned directly instead of trying and failing to follow the redirect.

  • When following redirects, methods other than POST will no longer be transformed into GET requests. 301 (permanent) redirects are now treated the same way as 302 (temporary) and 303 (see other) redirects in this respect.

  • Following redirects now works with body_producer.


  • The tornado.stack_context module has been removed.



  • AsyncHTTPTestCase now drops all references to the Application during tearDown, allowing its memory to be reclaimed sooner.

  • AsyncTestCase now cancels all pending coroutines in tearDown, in an effort to reduce warnings from the python runtime about coroutines that were not awaited. Note that this may cause asyncio.CancelledError to be logged in other places. Coroutines that expect to be running at test shutdown may need to catch this exception.


  • The asynchronous decorator has been removed.

  • The callback argument to RequestHandler.flush has been removed.

  • StaticFileHandler now supports large negative values for the Range header and returns an appropriate error for end > start.

  • It is now possible to set expires_days in xsrf_cookie_kwargs.


  • Pings and other messages sent while the connection is closing are now silently dropped instead of logging exceptions.

  • Errors raised by open() are now caught correctly when this method is a coroutine.


  • WSGIApplication and WSGIAdapter have been removed.