
后端Web框架异步编程WebSocket【免费下载链接】tornadoTornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.项目地址https://gitcode.com/gh_mirrors/to/tornado点击查看免费下载Tornado 2.0发布于 2011 年 6 月 21 日是 Tornado 发展史上的一个关键里程碑它把模板输出默认改为自动转义、将默认的异步 HTTP 客户端实现切换为纯 Python 的 simple_httpclient并首次正式支持 Python 3.2。本文以官方发布说明 docs/releases/v2.0.0.rst 为骨架结合当前仓库源码逐一拆解这些变更的动机、用法与底层实现帮助读者理解从 1.x 升级到 2.0 时需要注意的全部兼容性要点。版本概览三大主要变更Tornado 2.0 的核心变化可以归结为三点模板输出默认自动转义autoescape所有{{ ... }}表达式默认经过 HTML 转义从根上缓解 XSS跨站脚本风险默认 AsyncHTTPClient 实现改为 simple_httpclient不再依赖 libcurl纯 Python 实现成为默认选择支持 Python 3.2代码库为 Python 3 兼容做了大量改动也因此带来更多升级风险。这三点中前两项都带有明显的向后兼容影响升级时需特别留意详见下文各节。模板自动转义默认开启防御 XSS 的第一道防线行为变化与兼容性影响在 2.0 之前模板中的{{ expression }}是原样输出的从 2.0 开始模板输出默认自动转义。这意味着所有插入到页面中的变量都会被xhtml_escape处理、、、、等字符会被转义为安全的 HTML 实体见 tornado/escape.py 的实现。这一改动对安全性意义重大——Web 应用最常见的 XSS 漏洞正是源于未转义的用户输入直接输出到页面。但它的代价是所有从旧版本升级的应用要么显式关闭自动转义要么改造模板以适配新行为。对大多数应用而言最简单的关闭方式是给Application构造函数传autoescapeNoneapplication tornado.web.Application( handlers, autoescapeNone, # 关闭全局自动转义不推荐仅用于快速迁移 )需要特别注意的是这一改动会波及若干内置方法例如xsrf_form_html和linkify的输出本意是安全的 HTML 片段在自动转义生效后必须改用{% raw %}包裹而不能用{{ }}调用否则生成的input标签或链接会被转义成纯文本。新增模板指令autoescape、raw 与 module为配合自动转义模板系统新增了三个指令详见 tornado/template.py 的指令文档{% autoescape function %}在当前模板文件内切换转义模式不影响其他文件包括被{% include %}引用的文件。可传一个转义函数名或传None关闭{% autoescape xhtml_escape %} # 显式开启转义 {% autoescape None %} # 关闭当前文件的转义{% raw ... %}原样输出不做任何转义。用于输出已经保证安全的 HTML 片段如xsrf_form_html、linkify的结果。{% module ... %}调用 UIModule。2.0 起可以用{% module Template(path, **kwargs) %}调用另一个模板并获得一个完全独立的命名空间——这与{% include %}共享局部变量的行为不同适合隔离子模板上下文、避免变量污染。源码级实现转义发生在哪一层从 tornado/template.py 可以看到Template对象的autoescape取值优先级为构造参数显式指定 加载器Loader的autoescape 内置默认值_DEFAULT_AUTOESCAPE。而应用层的autoescape设置由RequestHandler.create_template_loader透传给template.Loader见 tornado/web.py其中对autoescapeNone做了专门处理——只有用户显式要求时才传递该参数避免误覆盖加载器默认值。真正的转义发生在编译后的模板代码中tornado/template.py每个表达式求值后若self.raw为假且当前模板启用了 autoescape则追加一行_tt_tmp _tt_utf8(xhtml_escape(_tt_tmp))之类的调用把表达式结果用注册的转义函数包一层再追加到输出缓冲区。这就是为什么{% raw %}在生成的 Python 代码里对应一个独立的raw标志位而{{ }}与{% raw %}的差别是编译期而非运行期决定的。AsyncHTTPClient 默认实现切换从 curl 到 pure-Python为什么换默认实现2.0 之前AsyncHTTPClient默认使用基于 libcurl 的curl_httpclient。2.0 起默认实现切换为纯 Python 的simple_httpclient它不依赖任何外部 C 库安装和部署更简单行为也更可控。这一变更在 tornado/httpclient.py 的configurable_default中体现得淋漓尽致——当前源码中AsyncHTTPClient的默认实现类正是SimpleAsyncHTTPClient。恢复使用 curl_httpclient若应用希望继续使用curl_httpclient需要在进程启动时尽早调用from tornado.httpclient import AsyncHTTPClient AsyncHTTPClient.configure(tornado.curl_httpclient.CurlAsyncHTTPClient)configure是AsyncHTTPClient的类方法见 tornado/httpclient.py用于在运行时替换整个AsyncHTTPClient的实现子类同时可传入额外关键字参数。特别提示Python 2.5 用户大概率需要 curl_httpclient因为 simple_httpclient 只在 Python 2.6 及以上才支持 SSL2.5 的ssl模块能力不足。此外curl_httpclient至今仍保留 simple_httpclient 所没有的特性例如 HTTP 代理支持和指定网络接口见 tornado/httpclient.py 的模块说明有这些需求的应用也应显式配置为 curl 实现。USE_SIMPLE_HTTPCLIENT 环境变量被移除此前通过USE_SIMPLE_HTTPCLIENT环境变量切换实现的机制在 2.0 中不再受支持一律改用AsyncHTTPClient.configure。这也让实现选择的逻辑从进程环境收敛为代码显式声明更清晰也更可控。Python 3.2 支持一次涉及全代码库的兼容性改造2.0 正式支持 Python 3.2。正如发布说明强调的Python 3 兼容涉及整个代码库的许多改动包括但不限于字符串与字节串的类型边界被重新梳理例如模板表达式在 Python 3 下需先str()再编码为 UTF-8见 tornado/template.py标准库模块名与行为差异的适配urllib、http、concurrent等模块在不同大版本间分化明显迭代器、字典视图等语义差异对框架内部逻辑的影响。因此官方强烈建议升级到 2.0 时应用需要比平时更充分、更彻底地测试。其他重要变更详解1. IPv6 支持HTTPServer 与 HTTPClientHTTPServer现在默认在可用时监听 IPv6。如要强制使用 IPv4在HTTPServer.bind()时传familysocket.AF_INETserver tornado.httpserver.HTTPServer(app) server.bind(port, address, familysocket.AF_INET)当前仓库中 HTTPServer 对请求连接的处理已显式区分socket.AF_INET与socket.AF_INET6两种地址族见 tornado/httpserver.pyremote_ip的提取逻辑正是基于此。HTTPClientHTTPRequest新增allow_ipv6布尔参数。默认值因实现而异simple_httpclient 默认 falsecurl_httpclient 默认 true。这一点在 tornado/httpclient.py 的HTTPRequest参数文档中仍可看到其演进痕迹当前版本默认值已统一为 True但 2.0 时的实现差异是升级者需要知道的。2. 自定义查询参数编码override decode_argument默认情况下请求参数按 UTF-8 解码。2.0 起子类可以重写RequestHandler.decode_argument(value, name)来使用其他编码如 GBK、Latin-1 等。该方法同时服务于get_argument()和 URL 正则捕获组传给 handler 方法的参数见 tornado/web.py。class MyHandler(tornado.web.RequestHandler): def decode_argument(self, value, nameNone): return value.decode(gbk) # 以 GBK 解码查询参数3. ETag 计算可定制或禁用默认 ETag 由compute_etag()计算对已写入输出缓冲区的所有内容做 SHA-1 哈希并加引号包裹见 tornado/web.py。2.0 起可重写该方法实现自定义 ETag或返回None直接禁用默认 ETag 支持——此时set_etag_header()不会设置任何 ETag 头tornado/web.py。def compute_etag(self): # 基于自定义逻辑生成 ETag返回 None 则禁用 return custom-etag-%s % some_version_string4. JSON 输出自动设置 Content-TypeRequestHandler.write(dict)现在会把响应头的Content-Type设置为application/json而不是此前的默认文本类型。这消除了返回 JSON 却携带 text/html 头的常见陷阱让客户端尤其是 fetch/XHR能正确解析响应体。5. HTTP OPTIONS 请求不再要求 XSRF TokenXSRF 防护的目标是改变服务器状态的请求POST/PUT/DELETE 等而 OPTIONS 通常用于 CORS 预检并不改变状态。2.0 将其从 XSRF 校验范围中剔除避免跨域场景下预检请求被 403 拦截。6. IOStream 回调统一调度与性能改进所有IOStream回调现在都通过IOLoop.add_callback直接调度到 IOLoop 上执行而非在底层 socket 事件中直接调用。这一改动让回调执行时机更加统一、可预测也有利于并发安全。同时本次发布对大量使用 IOLoop 超时的应用做了针对性性能优化官方称这类场景下性能提升尤其明显。升级 1.x → 2.0 行动清单结合发布说明从 1.x 升级到 2.0 时建议按以下顺序检查模板先确认{{ }}输出自动转义不会破坏现有页面。要么逐模板使用{% raw %}/{% autoescape None %}精确控制要么在Application构造时传autoescapeNone整体关闭后者仅作为迁移期过渡手段内置 HTML 方法xsrf_form_html、linkify的调用处必须改用{% raw %}包裹HTTP 客户端实现如依赖 curl 特性代理、指定网卡或运行于 Python 2.5在进程启动处调用AsyncHTTPClient.configure(tornado.curl_httpclient.CurlAsyncHTTPClient)同时删除对USE_SIMPLE_HTTPCLIENT环境变量的依赖编码非 UTF-8 查询参数的应用重写decode_argument缓存/协商如对 ETag 有特殊需求重写compute_etag注意write(dict)现在返回application/json前端解析逻辑需同步确认Python 3.2对应用做全量回归测试重点关注字符串/字节串处理路径。总结Tornado 2.0 通过模板自动转义默认开启和纯 Python HTTP 客户端默认化两项决策显著降低了应用的安全风险与部署复杂度同时用 Python 3.2 支持为后续跨版本演进铺平了道路。尽管发布说明本身精炼但结合当前仓库源码tornado/template.py、tornado/web.py、tornado/httpclient.py可以看到这些变更早已融入框架的默认行为与可配置体系中理解它们的来龙去脉对排查旧应用迁移问题与理解现代 Tornado 的设计取舍都大有裨益。赞分享后端Web框架异步编程WebSocket【免费下载链接】tornadoTornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.项目地址https://gitcode.com/gh_mirrors/to/tornado点击查看免费下载相关推荐XGBoost 3.3.0 新特性深度解析expectile 回归、QuadratureTreeSHAP 与默认分类特征支持XGBoost 3.3.0 新特性深度解析expectile 回归、QuadratureTreeSHAP 与默认分类特征支持 XGBoost 3.3.020人工智能机器学习MONAI 1.5新特性深析NumPy 2.0支持与性能优化MONAI 1.5新特性深析NumPy 2.0支持与性能优化 引言医疗AI的性能革命 在医疗影像分析领域处理高分辨率3D数据时的性能瓶颈一直是算法落地的主人工智能深度学习计算机视觉医疗健康预训练从0开始玩转YimMenuGTA5玩家自保与功能增强的3步上手路线从0开始玩转YimMenuGTA5玩家自保与功能增强的3步上手路线 如果你在公开战局里被莫名其妙地卡死过、被弹回故事模式过、甚至被改得无法正常游玩那一定开发工具CLI代码生成上一篇RAWGraphs-app开源贡献指南提交PR前的代码检查清单下一篇rules_nodejs未来展望工具链演进与路线图分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考