- 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 withasync def
, useawait
instead ofyield
to wait on an asynchronous operation. Coroutines defined with async/await will be faster than those defined with@gen.coroutine
andyield
, but do not support some features including .Callback/.Wait or the ability to yield a TwistedDeferred
. See :ref:`the users' guide <native_coroutines>` for more. - The async/await keywords are also available when compiling with Cython in older versions of Python.
- 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.
- 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), andbackports_abc>=0.4
on all versions prior to 3.5. These dependencies will be installed automatically when installing withpip
orsetup.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).
- 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.
- Fixed an issue with the autoreload command-line wrapper in which imports would be incorrectly interpreted as relative.
- Fixed parsing of multi-line headers.
allow_nonstandard_methods=True
now bypasses body sanity checks, in the same way as insimple_httpclient
.- The
PATCH
method now allows a body withoutallow_nonstandard_methods=True
.
- .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, thebackports_abc
package must be installed for this functionality.Multi
and .multi_future are deprecated and replaced by a unified function .multi.
- tornado.httpclient.HTTPError is now copyable with the copy module.
- Requests containing both
Content-Length
andTransfer-Encoding
will be treated as an error.
- .HTTPHeaders can now be pickled and unpickled.
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.
- 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 theerror
attribute of .IOStream but may be more easily accessible than the .IOStream itself. - Improved error handling in ~.BaseIOStream.read_until_close.
- Logging is less noisy when an SSL server is port scanned.
EINTR
is now handled on all reads.
- tornado.locale.load_translations now accepts encodings other than
UTF-8. UTF-16 and UTF-8 will be detected automatically if a BOM is
present; for other encodings .load_translations has an
encoding
parameter.
- .Lock and .Semaphore now support the
async with
statement on Python 3.5.
- A new time-based log rotation mode is available with
--log_rotate_mode=time
,--log-rotate-when
, andlog-rotate-interval
.
- .bind_sockets now supports
SO_REUSEPORT
with thereuse_port=True
argument.
- Dashes and underscores are now fully interchangeable in option names.
- .Queue now supports the
async for
statement on Python 3.5.
- When following redirects,
streaming_callback
andheader_callback
will no longer be run on the redirect responses (only the final non-redirect). - Responses containing both
Content-Length
andTransfer-Encoding
will be treated as an error.
- 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 newtemplate_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 issingle
, which is the same behavior as prior versions of Tornado. - Non-ASCII filenames are now supported.
- .ExpectLog objects now have a boolean
logged_stack
attribute to make it easier to test whether an exception stack trace was logged.
- 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 assecure
orhttponly
on the XSRF cookie. - .Application.listen now returns the .HTTPServer it created.
- Fixed handling of continuation frames when compression is enabled.