Skip to content
Cannot retrieve contributors at this time
What's new in Tornado 3.1
Jun 15, 2013
- Many reference cycles have been broken up throughout the package,
allowing for more efficient garbage collection on CPython.
- Silenced some log messages when connections are opened and immediately
closed (i.e. port scans), or other situations related to closed
- Various small speedups: .HTTPHeaders case normalization, .UIModule
proxy objects, precompile some regexes.
- ~tornado.auth.OAuthMixin always sends
oauth_version=1.0 in its
request as required by the spec.
- ~tornado.auth.FacebookGraphMixin now uses
in ~.FacebookGraphMixin.facebook_request to allow the base url to be
authorize_redirect methods in the
tornado.auth mixin classes all now return Futures. These methods
are asynchronous in .OAuthMixin and derived classes, although they
do not take a callback. The .Future these methods return must be
yielded if they are called from a function decorated with .gen.coroutine
(but not .gen.engine).
- .TwitterMixin now uses
/account/verify_credentials to get information
about the logged-in user, which is more robust against changing screen
demos directory (in the source distribution) has a new
twitter demo using .TwitterMixin.
- .url_escape and .url_unescape have a new
plus argument (defaulting
to True for consistency with the previous behavior) which specifies
whether they work like urllib.parse.unquote or urllib.parse.unquote_plus.
- Fixed a potential memory leak with long chains of tornado.gen coroutines.
- tornado.httpclient.HTTPRequest takes a new argument
which can be either
digest. Digest authentication
is only supported with
tornado.curl_httpclient no longer goes into an infinite loop when
pycurl returns a negative timeout.
curl_httpclient now supports the
without the use of
- Worked around a class of bugs in libcurl that would result in
errors from .IOLoop.update_handler in various scenarios including
digest authentication and socks proxies.
TCP_NODELAY flag is now set when appropriate in
simple_httpclient no longer logs exceptions, since those exceptions
are made available to the caller as
- tornado.httpserver.HTTPServer handles malformed HTTP headers more
- .HTTPServer now supports lists of IPs in
(it chooses the last, i.e. nearest one).
- Memory is now reclaimed promptly on CPython when an HTTP request
fails because it exceeded the maximum upload size.
TCP_NODELAY flag is now set when appropriate in .HTTPServer.
- The .HTTPServer
no_keep_alive option is now respected with
HTTP 1.0 connections that explicitly pass
Connection: keep-alive check for HTTP 1.0 connections is now
- The str and repr of tornado.httpserver.HTTPRequest no longer
include the request body, reducing log spam on errors (and potential
exposure/retention of private data).
- The cache used in .HTTPHeaders will no longer grow without bound.
- Some .IOLoop implementations (such as
pyzmq) accept objects
other than integer file descriptors; these objects will now have
.close() method called when the
IOLoop` is closed with
- The stub handles left behind by .IOLoop.remove_timeout will now get
cleaned up instead of waiting to expire.
- Fixed a bug in .BaseIOStream.read_until_close that would sometimes
cause data to be passed to the final callback instead of the streaming
- The .IOStream close callback is now run more reliably if there is
an exception in
- New method .BaseIOStream.set_nodelay can be used to set the
- Fixed a case where errors in
SimpleAsyncHTTPClient) were not being reported correctly.
- .Locale.format_date now works on Python 3.
- The default .Resolver implementation now works on Solaris.
- .Resolver now has a ~.Resolver.close method.
- Fixed a potential CPU DoS when
is used on certificates with an abusive wildcard pattern.
- All instances of .ThreadedResolver now share a single thread pool,
whose size is set by the first one to be created (or the static
- .ExecutorResolver is now documented for public use.
- .bind_sockets now works in configurations with incomplete IPv6 support.
- tornado.options.define with
multiple=True now works on Python 3.
- tornado.options.options and other .OptionParser instances support some
new dict-like methods: ~.OptionParser.items(), iteration over keys,
and (read-only) access to options with square braket syntax.
.OptionParser.group_dict returns all options with a given group
name, and .OptionParser.as_dict returns all options.
- tornado.process.Subprocess no longer leaks file descriptors into
the child process, which fixes a problem in which the child could not
detect that the parent process had closed its stdin pipe.
- .Subprocess.set_exit_callback now works for subprocesses created
without an explicit
- tornado.stack_context has been rewritten and is now much faster.
- New function .run_with_stack_context facilitates the use of stack
contexts with coroutines.
- The constructors of .TCPServer and .HTTPServer now take a
max_buffer_size keyword argument.
- Some internal names used by the template system have been changed;
now all "reserved" names in templates start with
- tornado.testing.AsyncTestCase.wait now raises the correct exception
when it has been modified by tornado.stack_context.
- tornado.testing.gen_test can now be called as
to give some tests a longer timeout than others.
- The environment variable
ASYNC_TEST_TIMEOUT can now be set to
override the default timeout for .AsyncTestCase.wait and .gen_test.
- .bind_unused_port now passes
None instead of
0 as the port
getaddrinfo, which works better with some unusual network
- tornado.util.import_object now works with top-level module names that
do not contain a dot.
- tornado.util.import_object now consistently raises ImportError
instead of AttributeError when it fails.
handlers list passed to the tornado.web.Application constructor
and ~tornado.web.Application.add_handlers methods can now contain
lists in addition to tuples and ~tornado.web.URLSpec objects.
- tornado.web.StaticFileHandler now works on Windows when the client
If-Modified-Since timestamp before 1970.
- New method .RequestHandler.log_exception can be overridden to
customize the logging behavior when an exception is uncaught. Most
apps that currently override
_handle_request_exception can now
use a combination of .RequestHandler.log_exception and
- .RequestHandler.get_argument now raises .MissingArgumentError
(a subclass of tornado.web.HTTPError, which is what it raised previously)
if the argument cannot be found.
- .Application.reverse_url now uses .url_escape with
i.e. spaces are encoded as
%20 instead of
- Arguments extracted from the url path are now decoded with
plus=False, so plus signs are left as-is
instead of being turned into spaces.
- .RequestHandler.send_error will now only be called once per request,
even if multiple exceptions are caught by the stack context.
- The tornado.web.asynchronous decorator is no longer necessary for
methods that return a .Future (i.e. those that use the .gen.coroutine
or .return_future decorators)
- .RequestHandler.prepare may now be asynchronous if it returns a
.Future. The ~tornado.web.asynchronous decorator is not used with
prepare; one of the .Future-related decorators should be used instead.
RequestHandler.current_user may now be assigned to normally.
- .RequestHandler.redirect no longer silently strips control characters
and whitespace. It is now an error to pass control characters, newlines
- .StaticFileHandler has been reorganized internally and now has additional
extension points that can be overridden in subclasses.
- .StaticFileHandler now supports HTTP
.StaticFileHandler is still not suitable for files too large to
comfortably fit in memory, but
Range support is necessary in some
browsers to enable seeking of HTML5 audio and video.
- .StaticFileHandler now uses longer hashes by default, and uses the same
Etag as it does for versioned urls.
- .StaticFileHandler.make_static_url and .RequestHandler.static_url
now have an additional keyword argument
include_version to suppress
the url versioning.
- .StaticFileHandler now reads its file in chunks, which will reduce
- Fixed a problem with the
Date header and cookie expiration dates
when the system locale is set to a non-english configuration.
- .WebSocketHandler now catches .StreamClosedError and runs
~.WebSocketHandler.on_close immediately instead of logging a
- New method .WebSocketHandler.set_nodelay can be used to set the
- Fixed an exception in .WSGIContainer when the connection is closed
while output is being written.