Tornado 4.2 新特性¶

May 26, 2015¶

Backwards-compatibility notes¶

  • SSLIOStream.connect and IOStream.start_tls now validate certificatesby default.
  • Certificate validation will now use the system CA root certificates insteadof certifi when possible (i.e. Python 2.7.9+ or 3.4+). This includesIOStream and simple_httpclient, but not curl_httpclient.
  • The default SSL configuration has become stricter, usingssl.create_default_context where available on the client side.(On the server side, applications are encouraged to migrate from thessl_options dict-based API to pass an ssl.SSLContext instead).
  • The deprecated classes in the tornado.auth module, GoogleMixin,FacebookMixin, and FriendFeedMixin have been removed.

New modules: tornado.locks and tornado.queues¶

These modules provide classes for coordinating coroutines, merged fromToro.

To port your code from Toro’s queues to Tornado 4.2, import Queue,PriorityQueue, or LifoQueue from tornado.queues instead of fromtoro.

Use Queue instead of Toro’s JoinableQueue. In Tornado the methodsjoin and task_done are available on all queues, not on aspecial JoinableQueue.

Tornado queues raise exceptions specific to Tornado instead of reusingexceptions from the Python standard library.Therefore instead of catching the standard queue.Empty exception fromQueue.get_nowait, catch the special tornado.queues.QueueEmpty exception,and instead of catching the standard queue.Full from Queue.get_nowait,catch tornado.queues.QueueFull.

To port from Toro’s locks to Tornado 4.2, import Condition, Event,Semaphore, BoundedSemaphore, or Lock from tornado.locksinstead of from toro.

Toro’s Semaphore.wait allowed a coroutine to wait for the semaphore tobe unlocked without acquiring it. This encouraged unorthodox patterns; inTornado, just use acquire.

Toro’s Event.wait raised a Timeout exception after a timeout. InTornado, Event.wait raises tornado.gen.TimeoutError.

Toro’s Condition.wait also raised Timeout, but in Tornado, the Futurereturned by Condition.wait resolves to False after a timeout:

  1. @gen.coroutine
    def await_notification():
    if not (yield condition.wait(timeout=timedelta(seconds=1))):
    print('timed out')
    else:
    print('condition is true')

In lock and queue methods, wherever Toro accepted deadline as a keywordargument, Tornado names the argument timeout instead.

Toro’s AsyncResult is not merged into Tornado, nor its exceptionsNotReady and AlreadySet. Use a Future instead. If you wrote code likethis:

  1. from tornado import gen
  2. import toro
  3.  
  4. result = toro.AsyncResult()
  5.  
  6. @gen.coroutine
  7. def setter():
  8. result.set(1)
  9.  
  10. @gen.coroutine
  11. def getter():
  12. value = yield result.get()
  13. print(value) # Prints "1".

Then the Tornado equivalent is:

  1. from tornado import gen
  2. from tornado.concurrent import Future
  3.  
  4. result = Future()
  5.  
  6. @gen.coroutine
  7. def setter():
  8. result.set_result(1)
  9.  
  10. @gen.coroutine
  11. def getter():
  12. value = yield result
  13. print(value) # Prints "1".

tornado.autoreload¶

  • Improved compatibility with Windows.
  • Fixed a bug in Python 3 if a module was imported during a reload check.

tornado.concurrent¶

  • run_on_executor now accepts arguments to control which attributesit uses to find the IOLoop and executor.

tornado.curl_httpclient¶

  • Fixed a bug that would cause the client to stop processing requestsif an exception occurred in certain places while there is a queue.

tornado.escape¶

  • xhtml_escape now supports numeric character references in hexformat ( )

tornado.gen¶

  • WaitIterator no longer uses weak references, which fixes severalgarbage-collection-related bugs.
  • tornado.gen.Multi and tornado.gen.multi_future (which are used whenyielding a list or dict in a coroutine) now log any exceptions after thefirst if more than one Future fails (previously they would be loggedwhen the Future was garbage-collected, but this is more reliable).Both have a new keyword argument quiet_exceptions to suppresslogging of certain exception types; to use this argument you mustcall Multi or multi_future directly instead of simply yieldinga list.
  • multi_future now works when given multiple copies of the same Future.
  • On Python 3, catching an exception in a coroutine no longer leads toleaks via Exception.context.

tornado.httpclient¶

tornado.httpserver¶

tornado.httputil¶

tornado.ioloop¶

  • The IOLoop constructor now has a make_current keyword argumentto control whether the new IOLoop becomes IOLoop.current().
  • Third-party implementations of IOLoop should accept **kwargsin their initialize methods and pass them to the superclassimplementation.
  • PeriodicCallback is now more efficient when the clock jumps forwardby a large amount.

tornado.iostream¶

  • SSLIOStream.connect and IOStream.start_tls now validate certificatesby default.
  • New method SSLIOStream.wait_for_handshake allows server-side applicationsto wait for the handshake to complete in order to verify client certificatesor use NPN/ALPN.
  • The Future returned by SSLIOStream.connect now resolves after thehandshake is complete instead of as soon as the TCP connection isestablished.
  • Reduced logging of SSL errors.
  • BaseIOStream.read_until_close now works correctly when astreaming_callback is given but callback is None (i.e. whenit returns a Future)

tornado.locale¶

tornado.log¶

tornado.process¶

tornado.simple_httpclient¶

  • Improved performance on Python 3 by reusing a single ssl.SSLContext.
  • New constructor argument max_body_size controls the maximum responsesize the client is willing to accept. It may be bigger thanmax_buffer_size if streaming_callback is used.

tornado.tcpserver¶

tornado.util¶

tornado.web¶

  • Key versioning support for cookie signing. cookie_secret applicationsetting can now contain a dict of valid keys with version as key. Thecurrent signing key then must be specified via key_version setting.
  • Parsing of the If-None-Match header now follows the RFC and supportsweak validators.
  • Passing secure=False or httponly=False toRequestHandler.set_cookie now works as expected (previously only thepresence of the argument was considered and its value was ignored).
  • RequestHandler.get_arguments now requires that its strip argumentbe of type bool. This helps prevent errors caused by the slightly dissimilarinterfaces between the singular and plural methods.
  • Errors raised in _handle_request_exception are now logged more reliably.
  • RequestHandler.redirect now works correctly when called from a handlerwhose path begins with two slashes.
  • Passing messages containing % characters to tornado.web.HTTPErrorno longer causes broken error messages.

tornado.websocket¶

  • The on_close method will no longer be called more than once.
  • When the other side closes a connection, we now echo the received closecode back instead of sending an empty close frame.

原文:

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