Tornado 3.0 新特性¶
- The callback argument to many asynchronous methods is nowoptional, and these methods return a Future. The module now understands Futures, and these methods can be useddirectly without a gen.Task wrapper.
- New function returns the IOLoop that is runningon the current thread (as opposed to , whichreturns a specific thread’s (usually the main thread’s) IOLoop.
- New class tornado.netutil.Resolver provides an asynchronousinterface to DNS resolution. The default implementation is stillblocking, but non-blocking implementations are available using oneof three optional dependencies: using the concurrent.futures thread pool,tornado.platform.caresresolver.CaresResolver using the pycareslibrary, or tornado.platform.twisted.TwistedResolver using twisted
- Tornado’s logging is now less noisy, and it no longer goes directlyto the root logger, allowing for finer-grained configuration.
- New class wraps subprocess.Popen with access to the child’s file descriptors.
- IOLoop now has a static method like the one on AsyncHTTPClient, which can be used toselect an implementation other than the default.
- IOLoop can now optionally use a monotonic clock if available(see below for more details).
- Python 2.5 is no longer supported. Python 3 is now supported in a singlecodebase instead of using 2to3
- The tornado.database module has been removed. It is now availableas a separate package,
- Functions that take an io_loop parameter now default toIOLoop.current() instead of .
- Empty HTTP request arguments are no longer ignored. This applies toHTTPRequest.arguments and RequestHandler.get_argument[s]in WSGI and non-WSGI modes.
- On Python 3, tornado.escape.json_encode no longer accepts byte strings.
- On Python 3, the get_authenticated_user methods in now return character strings instead of byte strings.
- tornado.netutil.TCPServer has moved to its own module,tornado.tcpserver.
- The Tornado test suite now requires unittest2 when run on Python 2.6.
- is no longer a subclass of dict; attribute-styleaccess is now required.
Multiple modules¶
- Tornado no longer logs to the root logger. Details on the new loggingscheme can be found under the tornado.log module. Note that in somecases this will require that you add an explicit logging configurationin order to see any output (perhaps just calling logging.basicConfig()),although both and tornado.options.parse_command_linewill do this for you.
- On python 3.2+, methods that take an ssl_options argument (on, TCPServer, and ) now accept either adictionary of options or an ssl.SSLContext object.
- New optional dependency on to provide better supportfor working with threads. concurrent.futures is in the standard libraryfor Python 3.2+, and can be installed on older versions withpip install futures.
tornado.autoreload¶
- tornado.autoreload is now more reliable when there are errors at importtime.
- Scripts run by autoreload no longer inherit future importsused by Tornado.
tornado.auth¶
- On Python 3, the get_authenticated_user method family now returnscharacter strings instead of byte strings.
- Asynchronous methods defined in tornado.auth now return a, and their callback argument is optional. TheFuture interface is preferred as it offers better error handling(the previous interface just logged a warning and returned None).
- The tornado.auth mixin classes now define a methodget_auth_http_client, which can be overridden to use a non-default instance (e.g. to use a different IOLoop)
- Subclasses of are encouraged to overrideOAuthMixin._oauth_get_user_future instead of _oauth_get_user,although both methods are still supported.
tornado.concurrent¶
- New module tornado.concurrent contains code to support working with, or to emulate future-based interface when that moduleis not available.
tornado.curl_httpclient¶
- Preliminary support for tornado.curl_httpclient on Python 3. The latestofficial release of pycurl only supports Python 2, but Ubuntu has aport available in 12.10 (apt-get install python3-pycurl). This portcurrently has bugs that prevent it from handling arbitrary binary databut it should work for textual (utf8) resources.
- Fix a crash with libcurl 7.29.0 if a curl object is created and closedwithout being used.
tornado.escape¶
- On Python 3, json_encode no longer accepts byte strings.This mirrors the behavior of the underlying json module. Python 2 behavioris unchanged but should be faster.
tornado.gen¶
- New decorator @gen.coroutine is available as an alternative It automatically returns aFuture, and within the function instead ofcalling a callback you return a value with raise
gen.Return(value) (or simply return value in Python 3.3). - Generators may now yield objects.
- Callbacks produced by gen.Callback and are now automaticallystack-context-wrapped, to minimize the risk of context leaks when usedwith asynchronous functions that don’t do their own wrapping.
- Fixed a memory leak involving generators, RequestHandler.flush,and clients closing connections while output is being written.
- Yielding a large list no longer has quadratic performance.
tornado.httpclient¶
- AsyncHTTPClient.fetch now returns a and its callback argumentis optional. When the future interface is used, any error will be raisedautomatically, as if HTTPResponse.rethrow was called.
- and all AsyncHTTPClient constructorsnow take a defaults keyword argument. This argument should be adictionary, and its values will be used in place of correspondingattributes of that are not set.
- All unset attributes of tornado.httpclient.HTTPRequest are nowNone. The default values of some attributes(connect_timeout, request_timeout, follow_redirects,max_redirects, use_gzip, proxy_password,allow_nonstandard_methods, and validate_cert have been movedfrom to the clientimplementations.
- The max_clients argument to AsyncHTTPClient is now a keyword-onlyargument.
- Keyword arguments to are no longer usedwhen instantiating an implementation subclass directly.
- Secondary AsyncHTTPClient callbacks (streaming_callback,header_callback, and prepare_curl_callback) now respect.
tornado.httpserver¶
- no longer logs an error when it is unable to read a secondrequest from an HTTP 1.1 keep-alive connection.
- HTTPServer now takes a protocol keyword argument which can be setto https if the server is behind an SSL-decoding proxy that does notset any supported X-headers.
- tornado.httpserver.HTTPConnection now has a set_close_callbackmethod that should be used instead of reaching into its streamattribute.
- Empty HTTP request arguments are no longer ignored. This applies toHTTPRequest.arguments and RequestHandler.get_argument[s]in WSGI and non-WSGI modes.
tornado.ioloop¶
- New function IOLoop.current returns the IOLoop that is runningon the current thread (as opposed to , which returns aspecific thread’s (usually the main thread’s) IOLoop).
- New method IOLoop.add_future to run a callback on the IOLoop whenan asynchronous finishes.
- IOLoop now has a static method like the one on AsyncHTTPClient, which can be used toselect an implementation other than the default.
- The IOLoop poller implementations (select, epoll, kqueue)are now available as distinct subclasses of . InstantiatingIOLoop will continue to automatically choose the best availableimplementation.
- The constructor has a new keyword argument time_func,which can be used to set the time function used when scheduling callbacks.This is most useful with the time.monotonic function, introducedin Python 3.3 and backported to older versions via the monotimemodule. Using a monotonic clock here avoids problems when the systemclock is changed.
- New function returns the current time according to theIOLoop. To use the new monotonic clock functionality, all calls toIOLoop.add_timeout must be either pass a ora time relative to IOLoop.time, not . (time.time willcontinue to work only as long as the IOLoop’s time_func argumentis not used).
- New convenience method can be used to start an IOLoopjust long enough to run a single coroutine.
- New method IOLoop.add_callback_from_signal is safe to use in a signalhandler (the regular method may deadlock).
- IOLoop now uses where available (Python 2.6+on Unix) to avoid a race condition that could result in Python signalhandlers being delayed.
- Method IOLoop.running() has been removed.
- IOLoop has been refactored to better support subclassing.
- and add_callback_from_signal now takeargs, *kwargs to pass along to the callback.
tornado.iostream¶
- IOStream.connect now has an optional server_hostname argumentwhich will be used for SSL certificate validation when applicable.Additionally, when supported (on Python 3.2+), this hostnamewill be sent via SNI (and this is supported by tornado.simple_httpclient)
- Much of has been refactored into a separate classBaseIOStream.
- New class provides the IOStreaminterface on pipe file descriptors.
- IOStream now raises a new exceptiontornado.iostream.StreamClosedError when you attempt to read orwrite after the stream has been closed (by either side).
- now simply closes the connection when it gets anECONNRESET error, rather than logging it as an error.
- IOStream.error no longer picks up unrelated exceptions.
- BaseIOStream.close now has an exc_info argument (similar to theone used in the module) that can be used to set the stream’serror attribute when closing it.
- BaseIOStream.read_until_close now works correctly when it is calledwhile there is buffered data.
- Fixed a major performance regression when run on PyPy (introduced inTornado 2.3).
tornado.log¶
- New module containing enable_pretty_logging and ,moved from the options module.
- LogFormatter now handles non-ascii data in messages and tracebacks better.
tornado.netutil¶
- New class tornado.netutil.Resolver provides an asynchronousinterface to DNS resolution. The default implementation is stillblocking, but non-blocking implementations are available using oneof three optional dependencies: using the concurrent.futures thread pool, using the pycareslibrary, or tornado.platform.twisted.TwistedResolver using twisted
- has a new flags argument that canbe used to pass additional flags to getaddrinfo.
- tornado.netutil.bind_sockets no longer sets AI_ADDRCONFIG; this willcause it to bind to both ipv4 and ipv6 more often than before.
- now works when Python was compiledwith —disable-ipv6 but IPv6 DNS resolution is available on thesystem.
- tornado.netutil.TCPServer has moved to its own module, tornado.tcpserver.
tornado.options¶
- The class underlying the functions in tornado.options is now public(). This can be used to create multipleindependent option sets, such as for subcommands.
- tornado.options.parse_config_file now configures logging automaticallyby default, in the same way that does.
- New function tornado.options.add_parse_callback schedules a callbackto be run after the command line or config file has been parsed. Thekeyword argument final=False can be used on either parsing functionto supress these callbacks.
- now takes a callback argument. This callbackwill be run with the new value whenever the option is changed. This isespecially useful for options that set other options, such as by readingfrom a config file.
- tornado.options.parse_command_line —help output now goes to stderrrather than stdout.
- is no longer a subclass of dict; attribute-styleaccess is now required.
- (and OptionParser instances generally) nowhave a method that returns a wrapper object compatible withmock.patch.
- Function tornado.options.enable_pretty_logging has been moved to the module.
tornado.platform.caresresolver¶
- New module containing an asynchronous implementation of the interface, using the pycares library.
tornado.platform.twisted¶
- New class allows Tornadocode to be run on the Twisted reactor (as opposed to the existingTornadoReactor, which bridges the gap in the other direction).
- New class is an asynchronousimplementation of the Resolver interface.
tornado.process¶
- New class tornado.process.Subprocess wraps withPipeIOStream access to the child’s file descriptors.
tornado.simple_httpclient¶
- SimpleAsyncHTTPClient now takes a resolver keyword argument(which may be passed to either the constructor or configure), to allow it to use the new non-blocking.
- When following redirects, SimpleAsyncHTTPClient now treats a 302response code the same as a 303. This is contrary to the HTTP specbut consistent with all browsers and other major HTTP clients(including CurlAsyncHTTPClient).
- The behavior of header_callback with SimpleAsyncHTTPClient haschanged and is now the same as that of CurlAsyncHTTPClient. Theheader callback now receives the first line of the response (e.g.HTTP/1.0 200 OK) and the final empty line.
- tornado.simple_httpclient now accepts responses with a 304status code that include a Content-Length header.
- Fixed a bug in which SimpleAsyncHTTPClient callbacks were being run in theclient’s stack_context.
tornado.stack_context¶
- now runs the wrapped callback in a more consistentenvironment by recreating contexts even if they already exist on thestack.
- Fixed a bug in which stack contexts could leak from one callbackchain to another.
- Yield statements inside a with statement can cause stackcontexts to become inconsistent; an exception will now be raisedwhen this case is detected.
tornado.template¶
- Errors while rendering templates no longer log the generated code,since the enhanced stack traces (from version 2.1) should make thisunnecessary.
- The {% apply %} directive now works properly with functions that returnboth unicode strings and byte strings (previously only byte strings weresupported).
- Code in templates is no longer affected by Tornado’s future imports(which previously included absolute_import and division).
tornado.testing¶
- New function tornado.testing.bind_unused_port both chooses a portand binds a socket to it, so there is no risk of another processusing the same port. get_unused_port is now deprecated.
- New decorator can be used to allow foryielding tornado.gen objects in tests, as an alternative to thestop and wait methods of .
- tornado.testing.AsyncTestCase and friends now extend unittest2.TestCasewhen it is available (and continue to use the standard unittest modulewhen unittest2 is not available)
- can be used as a finer-grained alternativeto tornado.testing.LogTrapTestCase
- The command-line interface to now supportsadditional arguments from the underlying unittest module:verbose, quiet, failfast, catch, buffer.
- The deprecated —autoreload option of hasbeen removed. Use python -m tornado.autoreload as a prefix commandinstead.
- The —httpclient option of tornado.testing.main has been movedto tornado.test.runtests so as not to pollute the applicationoption namespace. The module’s new callbacksupport now makes it easy to add options from a wrapper scriptinstead of putting all possible options in tornado.testing.main.
- no longer calls AsyncHTTPClient.close for teststhat use the singleton .
- LogTrapTestCase no longer fails when run in unknown loggingconfigurations. This allows tests to be run under nose, which does itsown log buffering ( doesn’t do anything useful in thiscase, but at least it doesn’t break things any more).
tornado.util¶
- tornado.util.b (which was only intended for internal use) is gone.
tornado.web¶
- RequestHandler.set_header now overwrites previous header valuescase-insensitively.
- has new attributes path_args andpath_kwargs, which contain the positional and keyword argumentsthat are passed to the get/post/etc method. These attributesare set before those methods are called, so they are available duringprepare()
- tornado.web.ErrorHandler no longer requires XSRF tokens on POSTrequests, so posts to an unknown url will always return 404 instead ofcomplaining about XSRF tokens.
- Several methods related to HTTP status codes now take a reason keywordargument to specify an alternate “reason” string (i.e. the “Not Found” in“HTTP/1.1 404 Not Found”). It is now possible to set status codes otherthan those defined in the spec, as long as a reason string is given.
- The Date HTTP header is now set by default on all responses.
- Etag/If-None-Match requests now work with .
- StaticFileHandler no longer sets Cache-Control: public unnecessarily.
- When gzip is enabled in a , appropriateVary: Accept-Encoding headers are now sent.
- It is no longer necessary to pass all handlers for a host in a singleApplication.add_handlers call. Now the request will be matchedagainst the handlers for any host_pattern that includes the request’sHost header.
tornado.websocket¶
- Client-side WebSocket support is now available:tornado.websocket.websocket_connect
- has new methods ping and to send pings to the browser (notsupported on the draft76 protocol)