What’s new in Tornado 4.5

Apr 16, 2017

Backwards-compatibility warning

  • The tornado.websocket module now imposes a limit on the size of incoming messages, which defaults to 10MiB.

New module

General changes

  • Reduced the number of circular references, reducing memory usage and improving performance.


  • The tornado.auth module has been updated for compatibility with a change to Facebook’s access_token endpoint. This includes both the changes initially released in Tornado 4.4.3 and an additional change to support the `session_expires field in the new format. The session_expires field is currently a string; it should be accessed as int(user['session_expires']) because it will change from a string to an int in Tornado 5.0.


  • Autoreload is now compatible with the asyncio event loop.
  • Autoreload no longer attempts to close the IOLoop and all registered file descriptors before restarting; it relies on the CLOEXEC flag being set instead.


  • Suppressed some “‘NoneType’ object not callback” messages that could be logged at shutdown.


  • yield None is now equivalent to yield gen.moment. moment is deprecated. This improves compatibility with asyncio.
  • Fixed an issue in which a generator object could be garbage collected prematurely (most often when weak references are used.
  • New function is_coroutine_function identifies functions wrapped by coroutine or engine.


  • The Transfer-Encoding header is now parsed case-insensitively.


  • SimpleAsyncHTTPClient now follows 308 redirects.
  • CurlAsyncHTTPClient will no longer accept protocols other than http and https. To override this, set pycurl.PROTOCOLS and pycurl.REDIR_PROTOCOLS in a prepare_curl_callback.
  • CurlAsyncHTTPClient now supports digest authentication for proxies (in addition to basic auth) via the new proxy_auth_mode argument.
  • The minimum supported version of libcurl is now 7.22.0.


  • HTTPServer now accepts the keyword argument trusted_downstream which controls the parsing of X-Forwarded-For headers. This header may be a list or set of IP addresses of trusted proxies which will be skipped in the X-Forwarded-For list.
  • The no_keep_alive argument works again.


  • url_concat correctly handles fragments and existing query arguments.


  • Fixed 100% CPU usage after a callback returns an empty list or dict.
  • IOLoop.add_callback now uses a lockless implementation which makes it safe for use from __del__ methods. This improves performance of calls to add_callback from the IOLoop thread, and slightly decreases it for calls from other threads.


  • memoryview objects are now permitted as arguments to write.
  • The internal memory buffers used by IOStream now use bytearray instead of a list of bytes, improving performance.
  • Futures returned by write are no longer orphaned if a second call to write occurs before the previous one is finished.


  • Colored log output is now supported on Windows if the colorama library is installed and the application calls colorama.init() at startup.
  • The signature of the LogFormatter constructor has been changed to make it compatible with logging.config.dictConfig.


  • Worked around an issue that caused “LookupError: unknown encoding: latin1” errors on Solaris.


  • Subprocess no longer causes “subprocess still running” warnings on Python 3.6.
  • Improved error handling in cpu_count.


  • TCPClient now supports a source_ip and source_port argument.
  • Improved error handling for environments where IPv6 support is incomplete.




  • WebSocketHandler.on_message implementations may now be coroutines. New messages will not be processed until the previous on_message coroutine has finished.
  • The websocket_ping_interval and websocket_ping_timeout application settings can now be used to enable a periodic ping of the websocket connection, allowing dropped connections to be detected and closed.
  • The new websocket_max_message_size setting defaults to 10MiB. The connection will be closed if messages larger than this are received.
  • Headers set by RequestHandler.prepare or RequestHandler.set_default_headers are now sent as a part of the websocket handshake.
  • Return values from WebSocketHandler.get_compression_options may now include the keys compression_level and mem_level to set gzip parameters. The default compression level is now 6 instead of 9.


  • A new file upload demo is available in the file_upload directory.
  • A new TCPClient and TCPServer demo is available in the tcpecho directory.
  • Minor updates have been made to several existing demos, including updates to more recent versions of jquery.


The following people contributed commits to this release:

  • A. Jesse Jiryu Davis
  • Aaron Opfer
  • Akihiro Yamazaki
  • Alexander
  • Andreas Røsdal
  • Andrew Rabert
  • Andrew Sumin
  • Antoine Pietri
  • Antoine Pitrou
  • Artur Stawiarski
  • Ben Darnell
  • Brian Mego
  • Dario
  • Doug Vargas
  • Eugene Dubovoy
  • Iver Jordal
  • JZQT
  • James Maier
  • Jeff Hunter
  • Leynos
  • Mark Henderson
  • Michael V. DePalatis
  • Min RK
  • Mircea Ulinic
  • Ping
  • Ping Yang
  • Riccardo Magliocchetti
  • Samuel Chen
  • Samuel Dion-Girardeau
  • Scott Meisburger
  • Shawn Ding
  • TaoBeier
  • Thomas Kluyver
  • Vadim Semenov
  • matee
  • mike820324
  • stiletto
  • zhimin
  • 依云