What’s new in Tornado 4.2

May 26, 2015

Backwards-compatibility notes

  • SSLIOStream.connectIOStream.start_tls现在默认情况下会验证证书.

  • 现在,证书验证将尽可能使用系统CA根证书而不是certifi (即Python 2.7.9+或3.4+). 这包括IOStreamsimple_httpclient ,但不包括curl_httpclient .

  • 使用客户端可用的ssl.create_default_context ,默认的SSL配置变得更加严格. (在服务器端,鼓励应用程序从基于ssl_options dict的API迁移以传递ssl.SSLContext ).

  • tornado.auth模块中不推荐使用的类GoogleMixinFacebookMixinFriendFeedMixin已被删除.

New modules: tornado.locks and tornado.queues

这些模块提供了用于协调协程的类,这些类是从Toro合并而成的.

要将代码从Toro的队列移植到Tornado 4.2, LifoQueuetornado.queues而不是toro导入QueuePriorityQueueLifoQueue .

Use Queue instead of Toro’s JoinableQueue. In Tornado the methods join and task_done are available on all queues, not on a special JoinableQueue.

Tornado队列引发特定于Tornado的异常,而不是重用Python标准库中的异常. 因此,不是从Queue.get_nowait捕获标准的queue.Empty异常, Queue.get_nowait捕获特殊的tornado.queues.QueueEmpty异常,而不是从Queue.get_nowait捕获标准的queue.Full异常,而是捕获tornado.queues.QueueFull .

要从Toro的锁移植到Tornado 4.2,请从tornado.locks而不是toro导入ConditionEventSemaphoreBoundedSemaphoreLock .

Toro的Semaphore.wait允许协程在获取信标的情况下等待其解锁. 这鼓励了非正统的模式; 在龙卷风中,只需使用acquire .

Toro的Event.waitTimeout后引发了Timeout异常. 在龙卷风中, Event.wait引发tornado.gen.TimeoutError .

Toro的Condition.wait也提高了Timeout ,但是在龙卷风中, Condition.wait返回的Future在超时后解析为False:

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

在锁定和队列方法中,无论Toro接受deadline作为关键字参数的哪个位置,Tornado都将参数timeout命名为.

Toro的AsyncResult不会合并到Tornado中,也不会合并到NotReadyAlreadySet例外中. 请改用Future . 如果您编写这样的代码:

from tornado import gen
import toro

result = toro.AsyncResult()

@gen.coroutine
def setter():
    result.set(1)

@gen.coroutine
def getter():
    value = yield result.get()
    print(value)  # Prints "1".

Then the Tornado equivalent is:

from tornado import gen
from tornado.concurrent import Future

result = Future()

@gen.coroutine
def setter():
    result.set_result(1)

@gen.coroutine
def getter():
    value = yield result
    print(value)  # Prints "1".

tornado.autoreload

  • 改进了与Windows的兼容性.

  • 修复了在重新加载检查期间导入模块时Python 3中的错误.

tornado.concurrent

tornado.curl_httpclient

  • 修复了一个错误,如果在队列中的某些位置发生异常,该错误将导致客户端停止处理请求.

tornado.escape

  • xhtml_escape现在支持十六进制格式的数字字符引用(  

tornado.gen

  • WaitIterator不再使用弱引用,从而修复了几个与垃圾回收相关的错误.

  • tornado.gen.Multitornado.gen.Multitornado.gen.multi_future (用于在协tornado.gen.multi_future成列表或字典时使用)现在在第一个(如果多个) Future失败之后会记录任何异常(以前,当Future为垃圾时会记录这些异常)收集,但这更可靠). 两者都有一个新的关键字参数quiet_exceptions以禁止记录某些异常类型. 要使用此参数,您必须直接调用Multimulti_future ,而不是简单地产生一个列表.

  • 现在,如果给定同一Future多个副本, multi_future可以使用.

  • 在Python 3上,在协程中捕获异常不再通过Exception.__context__导致泄漏.

tornado.httpclient

tornado.ioloop

  • IOLoop构造函数现在具有make_current关键字参数,以控制新IOLoop是否变为IOLoop.current() .

  • IOLoop的第三方实现应在其IOLoop.initialize方法中接受**kwargs并将它们传递给超类实现.

  • 现在,当时钟向前跳很多时, PeriodicCallback效率更高.

tornado.iostream

  • SSLIOStream.connectIOStream.start_tls现在默认情况下会验证证书.

  • New method SSLIOStream.wait_for_handshake allows server-side applications to wait for the handshake to complete in order to verify client certificates or use NPN/ALPN.

  • Future的返回SSLIOStream.connect现在解决了握手完成的,而不是只要TCP连接建立后.

  • 减少SSL错误的记录.

  • 当给定streaming_callbackcallback为None时, BaseIOStream.read_until_close现在可以正常工作(即,当它返回Future

tornado.locale

tornado.log

tornado.simple_httpclient

  • 通过重新使用单个ssl.SSLContext改进了Python 3的性能.

  • 新的构造函数max_body_size变量max_body_size控制客户端愿意接受的最大响应大小. 如果使用streaming_callback则它可能大于max_buffer_size .

tornado.tcpserver

tornado.util

tornado.web

  • 关键版本支持cookie签名. cookie_secret应用程序设置现在可以包含以版本为键的有效键的字典. 然后必须通过key_version设置指定当前的签名密钥.

  • 现在,遵循RFC解析If-None-Match头,并支持弱验证器.

  • 现在,将secure=Falsehttponly=False传递给RequestHandler.set_cookie可以按预期工作(以前仅考虑参数的存在,而忽略其值).

  • 现在, RequestHandler.get_arguments要求其strip参数的类型为bool. 这有助于防止由于单数和复数方法之间的接口略有不同而导致的错误.

  • _handle_request_exception中引发的错误现在可以更可靠地记录.

  • 从路径为两个斜杠开始的处理程序中调用RequestHandler.redirect现在可以正常工作.

  • 将包含%字符的消息传递到tornado.web.HTTPError不再导致损坏的错误消息.

tornado.websocket

  • on_close方法将不再被调用一次以上.

  • 当另一端关闭连接时,我们现在回显收到的关闭代码,而不是发送空的关闭帧.