What’s new in Tornado 3.0

Mar 29, 2013

Highlights

  • 现在,许多异步方法的callback参数是可选的,并且这些方法返回Future . 现在, tornado.gen模块可以理解Futures ,并且无需gen.Task包装器即可直接使用这些方法.

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

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

  • Tornado’s logging is now less noisy, and it no longer goes directly to the root logger, allowing for finer-grained configuration.

  • 新类tornado.process.Subprocess包装了subprocess.PopenPipeIOStream访问孩子的文件描述符.

  • IOLoop现在具有一个静态configure方法,例如AsyncHTTPClient ,可用于选择默认方法以外的IOLoop实现.

  • IOLoop现在可以选择使用单调时钟(如果有)(请参阅下面的更多详细信息).

Backwards-incompatible changes

  • 不再支持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不再接受字节字符串.

  • On Python 3, the get_authenticated_user methods in tornado.auth now return character strings instead of byte strings.

  • tornado.netutil.TCPServer已移至其自己的模块tornado.tcpserver .

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

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

Detailed changes by module

Multiple modules

tornado.autoreload

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

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

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

tornado.auth

  • 在Python 3上, get_authenticated_user方法族现在返回字符串而不是字节字符串.

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

  • The tornado.auth mixin classes now define a method get_auth_http_client, which can be overridden to use a non-default AsyncHTTPClient instance (e.g. to use a different IOLoop)

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

tornado.concurrent

tornado.curl_httpclient

  • Python 3上对tornado.curl_httpclient初步支持tornado.curl_httpclient的最新正式发行版仅支持Python 2,而Ubuntu在12.10中提供了一个端口( apt-get install python3-pycurl ). 该端口当前有一些错误,使其无法处理任意二进制数据,但它应可用于文本(utf8)资源.

  • 如果创建和关闭了curl对象而未使用curl对象,则使用libcurl 7.29.0修复了崩溃问题.

tornado.escape

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

tornado.gen

  • 新的装饰器@gen.coroutine可作为@gen.engine的替代品. 它会自动返回Future ,并且在函数内而不是调用回调,而是使用raise gen.Return(value) return value (或者在Python 3.3中仅return value ).

  • 生成器现在可以产生Future对象.

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

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

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

tornado.httpclient

tornado.httpserver

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

  • HTTPServer现在带有一个protocol关键字参数,如果服务器位于未设置任何受支持的X头的SSL解码代理之后,则可以将其设置为https .

  • 现在, tornado.httpserver.HTTPConnection具有set_close_callback方法,该方法应该使用,而不是使用它的stream属性.

  • Empty HTTP request arguments are no longer ignored. This applies to HTTPRequest.arguments and RequestHandler.get_argument[s] in WSGI and non-WSGI modes.

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

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

tornado.platform.twisted

  • 新类tornado.platform.twisted.TwistedIOLoop允许Tornado代码在Twisted反应器上运行(与现有的TornadoReactor相对,后者在另一个方向TornadoReactor桥梁).

  • 新类tornado.platform.twisted.TwistedResolverResolver接口的异步实现.

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接受带有304状态码的响应,该响应包括Content-Length标头.

  • 修复了一个错误,该错误在客户端的stack_context运行SimpleAsyncHTTPClient回调.

tornado.stack_context

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

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

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

tornado.template

  • 渲染模板时出现的错误不再记录生成的代码,因为增强的堆栈跟踪(来自2.1版)应使此操作不必要.

  • {% apply %}指令现在可以与同时返回unicode字符串和字节字符串(以前仅支持字节字符串)的函数一起使用.

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

tornado.testing

  • 新函数tornado.testing.bind_unused_port都选择了一个端口并绑定了一个套接字,因此,没有其他进程使用相同端口的风险. get_unused_port现在已弃用.

  • 新的装饰器tornado.testing.gen_test可用于允许在测试中产生tornado.gen对象,以替代AsyncTestCasestopwait方法.

  • 现在, tornado.testing.AsyncTestCase和朋友可以在unittest2.TestCase可用时对其进行扩展(并在unittest2不可用时继续使用标准unittest模块)

  • tornado.testing.ExpectLog可以用作一个细粒度替代tornado.testing.LogTrapTestCase

  • 现在, tornado.testing.main的命令行界面支持来自底层unittest模块的其他参数: verbosequietfailfastcatchbuffer .

  • 不推荐使用的--autoreload的选项tornado.testing.main已被删除. 请使用python -m tornado.autoreload作为前缀命令.

  • --httpclient的选项tornado.testing.main已经移动到tornado.test.runtests以免污染应用程序选项命名空间. 现在, tornado.options模块的新回调支持使您可以轻松地从包装脚本添加选项,而不是将所有可能的选项放入tornado.testing.main .

  • 对于使用单例IOLoop.instance测试, AsyncHTTPTestCase不再调用AsyncHTTPClient.close .

  • 在未知的日志记录配置中运行时, LogTrapTestCase不再失败. 这样就可以在自己的日志缓冲下进行测试( LogTrapTestCase在这种情况下不会做任何有用的事情,但至少不会破坏任何内容).

tornado.util

  • tornado.util.b (仅用于内部使用)已消失.

tornado.web

  • 现在, RequestHandler.set_header不区分大小写地覆盖以前的标头值.

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

  • tornado.web.ErrorHandlerPOST请求上不再需要XSRF令牌,因此到未知URL的发布将始终返回404,而不是抱怨XSRF令牌.

  • Several methods related to HTTP status codes now take a reason keyword argument 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 other than those defined in the spec, as long as a reason string is given.

  • 现在,默认情况下,所有响应都设置了Date HTTP标头.

  • Etag / If-None-Match请求现在可以与StaticFileHandler .

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

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

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

tornado.websocket