What’s new in Tornado 4.3

Nov 6, 2015

Highlights

  • The new async/await keywords in Python 3.5 are supported. In most cases, async def can be used in place of the @gen.coroutine decorator. Inside a function defined with async def, use await instead of yield to wait on an asynchronous operation. Coroutines defined with async/await will be faster than those defined with @gen.coroutine and yield, but do not support some features including Callback/Wait or the ability to yield a Twisted Deferred. See the users’ guide for more.

  • The async/await keywords are also available when compiling with Cython in older versions of Python.

Deprecation notice

  • This will be the last release of Tornado to support Python 2.6 or 3.2. Note that PyPy3 will continue to be supported even though it implements a mix of Python 3.2 and 3.3 features.

Installation

  • Tornado has several new dependencies: ordereddict on Python 2.6, singledispatch on all Python versions prior to 3.4 (This was an optional dependency in prior versions of Tornado, and is now mandatory), and backports_abc>=0.4 on all versions prior to 3.5. These dependencies will be installed automatically when installing with pip or setup.py install. These dependencies will not be required when running on Google App Engine.

  • Binary wheels are provided for Python 3.5 on Windows (32 and 64 bit).

tornado.auth

  • New method OAuth2Mixin.oauth2_request can be used to make authenticated requests with an access token.

  • Now compatible with callbacks that have been compiled with Cython.

tornado.autoreload

  • Fixed an issue with the autoreload command-line wrapper in which imports would be incorrectly interpreted as relative.

tornado.curl_httpclient

  • Fixed parsing of multi-line headers.

  • allow_nonstandard_methods=True now bypasses body sanity checks, in the same way as in simple_httpclient.

  • The PATCH method now allows a body without allow_nonstandard_methods=True.

tornado.gen

  • WaitIterator now supports the async for statement on Python 3.5.

  • @gen.coroutine can be applied to functions compiled with Cython. On python versions prior to 3.5, the backports_abc package must be installed for this functionality.

  • Multi and multi_future are deprecated and replaced by a unified function multi.

tornado.httpclient

tornado.httpserver

  • Requests containing both Content-Length and Transfer-Encoding will be treated as an error.

tornado.httputil

tornado.ioloop

  • IOLoop(make_current=True) now works as intended instead of raising an exception.

  • The Twisted and asyncio IOLoop implementations now clear current() when they exit, like the standard IOLoops.

  • IOLoop.add_callback is faster in the single-threaded case.

  • IOLoop.add_callback no longer raises an error when called on a closed IOLoop, but the callback will not be invoked.

tornado.iostream

  • Coroutine-style usage of IOStream now converts most errors into StreamClosedError, which has the effect of reducing log noise from exceptions that are outside the application’s control (especially SSL errors).

  • StreamClosedError now has a real_error attribute which indicates why the stream was closed. It is the same as the error attribute of IOStream but may be more easily accessible than the IOStream itself.

  • Improved error handling in read_until_close.

  • Logging is less noisy when an SSL server is port scanned.

  • EINTR is now handled on all reads.

tornado.locale

tornado.locks

  • Lock and Semaphore now support the async with statement on Python 3.5.

tornado.log

  • A new time-based log rotation mode is available with --log_rotate_mode=time, --log-rotate-when, and log-rotate-interval.

tornado.netutil

  • bind_sockets now supports SO_REUSEPORT with the reuse_port=True argument.

tornado.options

  • Dashes and underscores are now fully interchangeable in option names.

tornado.queues

  • Queue now supports the async for statement on Python 3.5.

tornado.simple_httpclient

  • When following redirects, streaming_callback and header_callback will no longer be run on the redirect responses (only the final non-redirect).

  • Responses containing both Content-Length and Transfer-Encoding will be treated as an error.

tornado.template

  • tornado.template.ParseError now includes the filename in addition to line number.

  • Whitespace handling has become more configurable. The Loader constructor now has a whitespace argument, there is a new template_whitespace Application setting, and there is a new {% whitespace %} template directive. All of these options take a mode name defined in the tornado.template.filter_whitespace function. The default mode is single, which is the same behavior as prior versions of Tornado.

  • Non-ASCII filenames are now supported.

tornado.testing

  • ExpectLog objects now have a boolean logged_stack attribute to make it easier to test whether an exception stack trace was logged.

tornado.web

  • The hard limit of 4000 bytes per outgoing header has been removed.

  • StaticFileHandler returns the correct Content-Type for files with .gz, .bz2, and .xz extensions.

  • Responses smaller than 1000 bytes will no longer be compressed.

  • The default gzip compression level is now 6 (was 9).

  • Fixed a regression in Tornado 4.2.1 that broke StaticFileHandler with a path of /.

  • tornado.web.HTTPError is now copyable with the copy module.

  • The exception Finish now accepts an argument which will be passed to the method RequestHandler.finish.

  • New Application setting xsrf_cookie_kwargs can be used to set additional attributes such as secure or httponly on the XSRF cookie.

  • Application.listen now returns the HTTPServer it created.

tornado.websocket

  • Fixed handling of continuation frames when compression is enabled.