Tornado 4.0 新特性¶

July 15, 2014¶

Highlights¶

  • The tornado.web.stream_request_body decorator allows large files to beuploaded with limited memory usage.
  • Coroutines are now faster and are used extensively throughout Tornado itself.More methods now return Futures, including most IOStreammethods and RequestHandler.flush.
  • Many user-overridden methods are now allowed to return a Futurefor flow control.
  • HTTP-related code is now shared between the tornado.httpserver,tornado.simple_httpclient and tornado.wsgi modules, making supportfor features such as chunked and gzip encoding more consistent.HTTPServer now uses new delegate interfaces defined in tornado.httputilin addition to its old single-callback interface.
  • New module tornado.tcpclient creates TCP connections with non-blockingDNS, SSL handshaking, and support for IPv6.

Backwards-compatibility notes¶

  • tornado.concurrent.Future is no longer thread-safe; useconcurrent.futures.Future when thread-safety is needed.
  • Tornado now depends on the certifipackage instead of bundling its own copy of the Mozilla CA list. This willbe installed automatically when using pip or easy_install.
  • This version includes the changes to the secure cookie format firstintroduced in version 3.2.1, and the xsrf token changein version 3.2.2. If you are upgrading from an earlierversion, see those versions’ release notes.
  • WebSocket connections from other origin sites are now rejected by default.To accept cross-origin websocket connections, overridethe new method WebSocketHandler.check_origin.
  • WebSocketHandler no longer supports the old draft 76 protocol(this mainly affects Safari 5.x browsers). Applications should usenon-websocket workarounds for these browsers.
  • Authors of alternative IOLoop implementations should see the changesto IOLoop.add_handler in this release.
  • The RequestHandler.async_callback and WebSocketHandler.async_callbackwrapper functions have been removed; they have been obsolete for a longtime due to stack contexts (and more recently coroutines).
  • curl_httpclient now requires a minimum of libcurl version 7.21.1 andpycurl 7.18.2.
  • Support for RequestHandler.get_error_html has been removed;override RequestHandler.write_error instead.

Other notes¶

  • The git repository has moved to https://github.com/tornadoweb/tornado.All old links should be redirected to the new location.
  • An announcement mailing list is now available.
  • All Tornado modules are now importable on Google App Engine (althoughthe App Engine environment does not allow the system calls usedby IOLoop so many modules are still unusable).

tornado.auth¶

  • Fixed a bug in .FacebookMixin on Python 3.
  • When using the Future interface, exceptions are more reliably deliveredto the caller.

tornado.concurrent¶

  • tornado.concurrent.Future is now always thread-unsafe (previouslyit would be thread-safe if the concurrent.futures package was available).This improves performance and provides more consistent semantics.The parts of Tornado that accept Futures will accept both Tornado’sthread-unsafe Futures and the thread-safe concurrent.futures.Future.
  • tornado.concurrent.Future now includes all the functionalityof the old TracebackFuture class. TracebackFuture is nowsimply an alias for Future.

tornado.curl_httpclient¶

  • curl_httpclient now passes along the HTTP “reason” stringin response.reason.

tornado.gen¶

  • Performance of coroutines has been improved.
  • Coroutines no longer generate StackContexts by default, but theywill be created on demand when needed.
  • The internals of the tornado.gen module have been rewritten toimprove performance when using Futures, at the expense of someperformance degradation for the older YieldPoint interfaces.
  • New function with_timeout wraps a Future and raises an exceptionif it doesn’t complete in a given amount of time.
  • New object moment can be yielded to allow the IOLoop to run forone iteration before resuming.
  • Task is now a function returning a Future instead of a YieldPointsubclass. This change should be transparent to application code, butallows Task to take advantage of the newly-optimized Futurehandling.

tornado.http1connection¶

  • New module contains the HTTP implementation shared by tornado.httpserverand tornado.simple_httpclient.

tornado.httpclient¶

  • The command-line HTTP client (python -m tornado.httpclient - URL)now works on Python 3.
  • Fixed a memory leak in AsyncHTTPClient shutdown that affectedapplications that created many HTTP clients and IOLoops.
  • New client request parameter decompress_response replacesthe existing use_gzip parameter; both names are accepted.

tornado.httpserver¶

  • tornado.httpserver.HTTPRequest has moved totornado.httputil.HTTPServerRequest.
  • HTTP implementation has been unified with tornado.simple_httpclientin tornado.http1connection.
  • Now supports Transfer-Encoding: chunked for request bodies.
  • Now supports Content-Encoding: gzip for request bodies ifdecompress_request=True is passed to the HTTPServer constructor.
  • The connection attribute of HTTPServerRequest is now documentedfor public use; applications are expected to write their responsesvia the HTTPConnection interface.
  • The HTTPServerRequest.write and HTTPServerRequest.finish methodsare now deprecated. (RequestHandler.write and RequestHandler.finishare not deprecated; this only applies to the methods onHTTPServerRequest)
  • HTTPServer now supports HTTPServerConnectionDelegate in addition tothe old request_callback interface. The delegate interface supportsstreaming of request bodies.
  • HTTPServer now detects the error of an application sending aContent-Length error that is inconsistent with the actual content.
  • New constructor arguments max_header_size and max_body_sizeallow separate limits to be set for different parts of the request.max_body_size is applied even in streaming mode.
  • New constructor argument chunk_size can be used to limit the amountof data read into memory at one time per request.
  • New constructor arguments idle_connection_timeout and body_timeoutallow time limits to be placed on the reading of requests.
  • Form-encoded message bodies are now parsed for all HTTP methods, not justPOST, PUT, and PATCH.

tornado.httputil¶

tornado.ioloop¶

  • IOLoop.add_handler and related methods now accept file-like objectsin addition to raw file descriptors. Passing the objects is recommended(when possible) to avoid a garbage-collection-related problem in unit tests.
  • New method IOLoop.clear_instance makes it possible to uninstall thesingleton instance.
  • Timeout scheduling is now more robust against slow callbacks.
  • IOLoop.add_timeout is now a bit more efficient.
  • When a function run by the IOLoop returns a Future and that Futurehas an exception, the IOLoop will log the exception.
  • New method IOLoop.spawn_callback simplifies the process of launchinga fire-and-forget callback that is separated from the caller’s stack context.
  • New methods IOLoop.call_later and IOLoop.call_at simplify thespecification of relative or absolute timeouts (as opposed toadd_timeout, which used the type of its argument).

tornado.iostream¶

  • The callback argument to most IOStream methods is now optional.When called without a callback the method will return a Futurefor use with coroutines.
  • New method IOStream.start_tls converts an IOStream to anSSLIOStream.
  • No longer gets confused when an IOError or OSError withoutan errno attribute is raised.
  • BaseIOStream.read_bytes now accepts a partial keyword argument,which can be used to return before the full amount has been read.This is a more coroutine-friendly alternative to streaming_callback.
  • BaseIOStream.read_until and read_until_regex now acept amax_bytes keyword argument which will cause the request to fail ifit cannot be satisfied from the given number of bytes.
  • IOStream no longer reads from the socket into memory if it does notneed data to satisfy a pending read. As a side effect, the close callbackwill not be run immediately if the other side closes the connectionwhile there is unconsumed data in the buffer.
  • The default chunk_size has been increased to 64KB (from 4KB)
  • The IOStream constructor takes a new keyword argumentmax_write_buffer_size (defaults to unlimited). Calls toBaseIOStream.write will raise StreamBufferFullError if the amountof unsent buffered data exceeds this limit.
  • ETIMEDOUT errors are no longer logged. If you need to distinguishtimeouts from other forms of closed connections, examine stream.errorfrom a close callback.

tornado.netutil¶

  • When bind_sockets chooses a port automatically, it will now usethe same port for IPv4 and IPv6.
  • TLS compression is now disabled by default on Python 3.3 and higher(it is not possible to change this option in older versions).

tornado.options¶

  • It is now possible to disable the default logging configurationby setting options.logging to None instead of the string "none".

tornado.platform.asyncio¶

  • Now works on Python 2.6.
  • Now works with Trollius version 0.3.

tornado.platform.twisted¶

tornado.simple_httpclient¶

  • simple_httpclient has better support for IPv6, which is now enabledby default.
  • Improved default cipher suite selection (Python 2.7+).
  • HTTP implementation has been unified with tornado.httpserverin tornado.http1connection
  • Streaming request bodies are now supported via the body_producerkeyword argument to tornado.httpclient.HTTPRequest.
  • The expect_100_continue keyword argument totornado.httpclient.HTTPRequest allows the use of the HTTP Expect:
    100-continue feature.
  • simple_httpclient now raises the original exception (e.g. an IOError)in more cases, instead of converting everything to HTTPError.

tornado.stack_context¶

  • The stack context system now has less performance overhead when nostack contexts are active.

tornado.tcpclient¶

  • New module which creates TCP connections and IOStreams, includingname resolution, connecting, and SSL handshakes.

tornado.testing¶

  • AsyncTestCase now attempts to detect test methods that are generatorsbut were not run with @gen_test or any similar decorator (this wouldpreviously result in the test silently being skipped).
  • Better stack traces are now displayed when a test times out.
  • The @gen_test decorator now passes along args, *kwargs so itcan be used on functions with arguments.
  • Fixed the test suite when unittest2 is installed on Python 3.

tornado.web¶

  • It is now possible to support streaming request bodies with thestream_request_body decorator and the new RequestHandler.data_receivedmethod.
  • RequestHandler.flush now returns a Future if no callback is given.
  • New exception Finish may be raised to finish a request withouttriggering error handling.
  • When gzip support is enabled, all text/* mime types will be compressed,not just those on a whitelist.
  • Application now implements the HTTPMessageDelegate interface.
  • HEAD requests in StaticFileHandler no longer read the entire file.
  • StaticFileHandler now streams response bodies to the client.
  • New setting compress_response replaces the existing gzipsetting; both names are accepted.
  • XSRF cookies that were not generated by this module (i.e. strings withoutany particular formatting) are once again accepted (as long as thecookie and body/header match). This pattern was common fortesting and non-browser clients but was broken by the changes inTornado 3.2.2.

tornado.websocket¶

  • WebSocket connections from other origin sites are now rejected by default.Browsers do not use the same-origin policy for WebSocket connections as theydo for most other browser-initiated communications. This can be surprisingand a security risk, so we disallow these connections on the server sideby default. To accept cross-origin websocket connections, overridethe new method WebSocketHandler.check_origin.
  • WebSocketHandler.close and WebSocketClientConnection.close nowsupport code and reason arguments to send a status code andmessage to the other side of the connection when closing. Both classesalso have close_code and close_reason attributes to receive thesevalues when the other side closes.
  • The C speedup module now builds correctly with MSVC, and can supportmessages larger than 2GB on 64-bit systems.
  • The fallback mechanism for detecting a missing C compiler nowworks correctly on Mac OS X.
  • Arguments to WebSocketHandler.open are now decoded in the same wayas arguments to RequestHandler.get and similar methods.
  • It is now allowed to override prepare in a WebSocketHandler,and this method may generate HTTP responses (error pages) in the usualway. The HTTP response methods are still not allowed once theWebSocket handshake has completed.

tornado.wsgi¶

原文:

https://tornado-zh-cn.readthedocs.io/zh_CN/latest/releases/v4.0.0.html