Skip to main content

Tornado 3.0中的新功能

2013年3月29日

强调

  • 许多异步方法的 callback 参数现在是可选的,这些方法返回一个 Futuretornado.gen 模块现在可以理解 Futures,这些方法可以直接使用而无需 gen.Task 包装器。

  • 新函数 IOLoop.current 返回在当前线程上运行的 IOLoop (与 IOLoop.instance 相反,IOLoop.instance 返回特定线程的(通常是主线程的)IOLoop。

  • 新类 tornado.netutil.Resolver 为DNS解析提供异步接口。默认实现仍然是阻塞,但非阻塞实现可以使用三个可选依赖关系之一:ThreadedResolver 使用 concurrent.futures 线程池,tornado.platform.caresresolver.CaresResolver 使用 pycares 库或使用 twistedtornado.platform.twisted.TwistedResolver

  • Tornado的日志记录现在较少嘈杂,它不再直接到根记录器,允许更细粒度的配置。

  • 新类 tornado.process.SubprocessPipeIOStream 包装 subprocess.Popen 访问子文件描述符。

  • IOLoop 现在有一个像 AsyncHTTPClient 上的静态 configure 方法,它可以用于选择除默认值之外的 IOLoop 实现。

  • IOLoop 现在可以选择使用单调时钟(如果有的话)(更多细节见下文)。

向后不兼容的更改

  • 不再支持Python 2.5。 Python 3现在在单个代码库中支持,而不是使用 2to3

  • tornado.database 模块已删除。它现在可作为单独的包,torndb

  • 采用 io_loop 参数的函数现在默认为 IOLoop.current(),而不是 IOLoop.instance()

  • 不再忽略空的HTTP请求参数。这适用于WSGI和非WSGI模式下的 HTTPRequest.argumentsRequestHandler.get_argument[s]

  • 在Python 3上,tornado.escape.json_encode 不再接受字节字符串。

  • 在Python 3中,tornado.auth 中的 get_authenticated_user 方法现在返回字符串而不是字节字符串。

  • tornado.netutil.TCPServer 已迁移到自己的模块 tornado.tcpserver

  • 当在Python 2.6上运行时,Tornado测试套件现在需要 unittest2

  • tornado.options.options 不再是 dict 的子类;现在需要属性样式访问。

按模块的详细更改

多个模块

  • Tornado不再记录到根记录器。有关新记录方案的详细信息,请参见 tornado.log 模块。注意,在某些情况下,这将需要你添加一个显式日志配置为了看到任何输出(也许只是调用 logging.basicConfig()),虽然 IOLoop.start()tornado.options.parse_command_line 将为你做这个。

  • 在python 3.2+上,接受 ssl_options 参数(在 SSLIOStreamTCPServerHTTPServer)的方法现在接受选项字典或 ssl.SSLContext 对象。

  • concurrent.futures 的新的可选依赖关系,为使用线程提供更好的支持。 concurrent.futures 在Python 3.2+的标准库中,并且可以安装在具有 pip install futures 的旧版本上。

tornado.autoreload

  • 当导入时出现错误时,tornado.autoreload 现在更可靠。

  • 在同一 IOLoop 上调用 tornado.autoreload.start (或使用 debug=True 创建 Application)两次现在不执行任何操作(而不是创建多个周期性回调)。在同一进程中在多个 IOLoop 上启动自动重新载入现在会记录一个警告。

  • autoreload运行的脚本不再继承Tornado使用的 __future__ 导入。

tornado.auth

  • 在Python 3中,get_authenticated_user 方法家族现在返回字符串而不是字节字符串。

  • tornado.auth 中定义的异步方法现在返回一个 Future,它们的 callback 参数是可选的。 Future 接口是首选,因为它提供更好的错误处理(以前的接口只记录一个警告,并返回无)。

  • tornado.auth 混合类现在定义方法 get_auth_http_client,其可以被重写以使用非默认 AsyncHTTPClient 实例(例如,使用不同的 IOLoop

  • 鼓励 OAuthMixin 的子类重写 OAuthMixin._oauth_get_user_future 而不是 _oauth_get_user,尽管仍然支持这两种方法。

tornado.concurrent

tornado.curl_httpclient

  • 对Python 3的 tornado.curl_httpclient 的初步支持。最新的官方发布的pycurl只支持Python 2,但Ubuntu有一个端口可用12.10(apt-get install python3-pycurl)。这个端口当前有错误,阻止它处理任意二进制数据,但它应该工作的文本(utf8)资源。

  • 使用libcurl 7.29.0修复崩溃,如果创建和关闭而不使用curl对象。

tornado.escape

  • 在Python 3上,json_encode 不再接受字节字符串。这反映了底层json模块的行为。 Python 2的行为没有改变,但应该更快。

tornado.gen

  • 新装修工 @gen.coroutine 可作为 @gen.engine 的替代品。它自动返回一个 Future,并且在函数中,而不是调用回调,你返回一个值 raise gen.Return(value) (或在Python 3.3中简单的 return value)。

  • 生成器现在可以生成 Future 对象。

  • gen.Callbackgen.Task 产生的回调现在是自动堆栈上下文封装,以便在使用不执行自己的包装的异步函数时最小化上下文泄漏的风险。

  • 修复了涉及发生器,RequestHandler.flush 和客户端在写入输出时关闭连接的内存泄漏。

  • 产生大列表不再具有二次性能。

tornado.httpclient

tornado.httpserver

  • HTTPServer 无法从HTTP 1.1保持活动连接读取第二个请求时,不再记录错误。

  • HTTPServer 现在采用 protocol 关键字参数,如果服务器位于未设置任何支持的X标头的SSL解码代理之后,该参数可以设置为 https

  • tornado.httpserver.HTTPConnection 现在有一个 set_close_callback 方法,应该使用,而不是达到其 stream 属性。

  • 不再忽略空的HTTP请求参数。这适用于WSGI和非WSGI模式下的 HTTPRequest.argumentsRequestHandler.get_argument[s]

tornado.ioloop

tornado.iostream

  • IOStream.connect 现在有一个可选的 server_hostname 参数,将在适用时用于SSL证书验证。此外,当支持(在Python 3.2+),这个主机名将通过SNI发送(这是 tornado.simple_httpclient 支持的)

  • 大部分 IOStream 已被重构为单独的类 BaseIOStream

  • 新类 tornado.iostream.PipeIOStream 在管道文件描述符上提供IOStream接口。

  • IOStream 现在引发一个新的异常 tornado.iostream.StreamClosedError,当您尝试在流关闭后(任一侧)读取或写入。

  • IOStream 现在只是在获取 ECONNRESET 错误时关闭连接,而不是将其记录为错误。

  • IOStream.error 不再拾取无关的异常。

  • BaseIOStream.close 现在有一个 exc_info 参数(类似于 logging 模块中使用的一种),可以用来关闭时,它设置该流的 error 属性。

  • 当有缓冲数据时,BaseIOStream.read_until_close 现在正确工作。

  • 修正了在PyPy上运行时的主要性能回归(在Tornado 2.3中引入)。

tornado.log

tornado.netutil

tornado.options

tornado.platform.caresresolver

  • 新模块包含 Resolver 接口的异步实现,使用 pycares 库。

tornado.platform.twisted

tornado.process

tornado.simple_httpclient

  • SimpleAsyncHTTPClient 现在采用 resolver 关键字参数(可以传递给构造函数或 configure),以允许它使用新的非阻塞 tornado.netutil.Resolver

  • 当跟随重定向时,SimpleAsyncHTTPClient 现在处理302响应代码与303相同。这与HTTP规范相反,但与所有浏览器和其他主要HTTP客户端(包括 CurlAsyncHTTPClient)一致。

  • header_callbackSimpleAsyncHTTPClient 的行为已经改变,现在与 CurlAsyncHTTPClient 的行为相同。头部回调现在接收响应的第一行(例如 HTTP/1.0 200 OK)和最后的空行。

  • tornado.simple_httpclient 现在接受包含 Content-Length 标头的304状态代码的响应。

  • 修复了在客户端的 stack_context 中运行 SimpleAsyncHTTPClient 回调的错误。

tornado.stack_context

  • stack_context.wrap 现在通过重建上下文在更一致的环境中运行被包装的回调,即使它们已经存在于堆栈上。

  • 修复了一个错误,堆栈上下文可能从一个回调链泄漏到另一个。

  • with 语句内的yield语句可能导致堆栈上下文不一致;当检测到这种情况时,将引发异常。

tornado.template

  • 渲染模板时,错误会不再记录生成的代码,因为增强的堆栈跟踪(从版本2.1)应该使这不必要。

  • {% apply %} 指令现在可以正常工作与返回unicode字符串和字节字符串(以前只支持字节字符串)的函数。

  • 模板中的代码不再受Tornado的 __future__ 导入(以前包括 absolute_importdivision)的影响。

tornado.testing

tornado.util

  • tornado.util.b (仅供内部使用)不见了。

tornado.web

  • RequestHandler.set_header 现在不区分大小写覆盖以前的标题值。

  • tornado.web.RequestHandler 有新的属性 path_argspath_kwargs,它们包含传递给 get/post/etc方法的位置和关键字参数。这些属性在调用这些方法之前设置,因此它们在 prepare() 期间可用

  • tornado.web.ErrorHandler 不再需要针对 POST 请求的XSRF令牌,因此发布到未知网址的帖子将总是返回404,而不是抱怨XSRF令牌。

  • 与HTTP状态代码相关的几种方法现在采用 reason 关键字参数来指定备用“原因”字符串(即“HTTP/1.1 404 Not Found”中的“未找到”)。现在可以设置除规范中定义的状态代码之外的状态代码,只要给出原因字符串即可。

  • 默认情况下,所有响应都设置了 Date HTTP头。

  • Etag/If-None-Match 请求现在与 StaticFileHandler 合作。

  • StaticFileHandler 不再不必要地设置 Cache-Control: public

  • 当在 tornado.web.Application 中启用gzip时,现在将发送适当的 Vary: Accept-Encoding 头。

  • 不再需要在单个 Application.add_handlers 调用中传递主机的所有处理程序。现在请求将匹配任何包含请求的 Host 头的 host_pattern 的处理程序。

tornado.websocket