Skip to main content

Tornado 4.2中的新功能

2015年5月26日

向后兼容性说明

  • SSLIOStream.connectIOStream.start_tls 现在默认验证证书。

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

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

  • tornado.auth 模块中已弃用的类,GoogleMixinFacebookMixinFriendFeedMixin 已删除。

新模块:tornado.lockstornado.queues

这些模块提供协调协同程序的类,从 托罗 合并。

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

使用 Queue 而不是Toro的 JoinableQueue。在Tornado中,方法 jointask_done 在所有队列中可用,而不是在特殊的 JoinableQueue 上。

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

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

Toro的 Semaphore.wait 允许协程等待信号量被解锁 without 获取它。这鼓励非正统的模式;在Tornado,只使用 acquire

Toro的 Event.wait 在超时后引发了 Timeout 异常。在Tornado,Event.wait 提高 tornado.gen.TimeoutError

Toro的 Condition.wait 也提高了 Timeout,但是在Tornado中,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".

然后Tornado的等效是:

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.multi_future (当在协程中产生列表或字典时使用)现在在第一个之后记录任何异常,如果多个 Future 失败(以前当 Future 被垃圾收集时,它们将被记录,但是这更可靠) 。两者都有一个新的关键字参数 quiet_exceptions 来禁止记录某些异常类型;要使用此参数,您必须直接调用 Multimulti_future,而不是简单地产生列表。

  • multi_future 现在工作时给予同一 Future 的多个副本。

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

tornado.httpclient

tornado.httputil

tornado.ioloop

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

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

  • 当时钟向前跳跃大量时,PeriodicCallback 现在更有效率。

tornado.iostream

  • SSLIOStream.connectIOStream.start_tls 现在默认验证证书。

  • 新方法 SSLIOStream.wait_for_handshake 允许服务器端应用程序等待握手完成以验证客户端证书或使用NPN/ALPN。

  • SSLIOStream.connect 返回的 Future 现在在握手完成后解决,而不是一旦TCP连接建立就解决。

  • 减少SSL错误的日志记录。

  • BaseIOStream.read_until_close 现在在给定 streaming_callbackcallback 为无(即,当它返回 Future 时)正确地工作,

tornado.locale

tornado.log

tornado.simple_httpclient

  • 通过重用单个 ssl.SSLContext 来提高Python 3的性能。

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

tornado.tcpserver

tornado.util

tornado.web

  • 支持Cookie签名的密钥版本。 cookie_secret 应用程序设置现在可以包含版本为键的有效密钥的dict。当前签名密钥必须通过 key_version 设置指定。

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

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

  • RequestHandler.get_arguments 现在要求其 strip 参数的类型为bool。这有助于防止由单数和复数方法之间的稍微不同的接口引起的错误。

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

  • RequestHandler.redirect 现在可以从路径以两个斜杠开头的处理程序调用时正确工作。

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

tornado.websocket

  • on_close 方法将不再被调用多次。

  • 当另一方关闭连接时,我们现在回应接收到的关闭代码,而不是发送一个空的关闭帧。