| 失效链接处理 |
|
Tornado 6.5,全面支持 Python 3.14
相关截图:
![]() 主要内容:
先认识下 Tornado
Tornado 最早出自 FriendFeed,后来跟着团队一起进了 Facebook。它既是 Web 框架,也是一套异步网络库。和当时主流的同步 WSGI 框架不同,Tornado 从第一天就押在非阻塞 I/O 上:一个进程里用事件循环把成千上万条连接同时挂着,特别适合长轮询、WebSocket、以及任何「用户连上来之后还不想马上断开」的场景。
它不是「又一个 Django」。Django、Flask 这类框架更擅长业务脚手架;Tornado 的强项是把连接本身管好。你写的还是熟悉的 RequestHandler,但底层的 IOLoop 会把 socket 读写、定时器和回调都揉进同一条事件循环。现在这条循环已经建立在 asyncio 之上,所以你完全可以在 Handler 里直接 await。
最低支持的 Python 版本,6.5 起变成了 3.9。3.8 已经告别,该换了就换。
6.5 这一版改了什么
官方把 Python 3.14 写进了支持列表。老版本在 3.14 上「能跑」和「被承认能跑」不是一回事:前者可能伴随着一串警告,后者才是你上生产该选的组合。
除了运行时版本,我觉得值得记住的还有这几条:
1. Python 3.14 官方支持 这是 6.5.0 的头条。3.14 自己也带了模板字符串(t-strings)、更好的 asyncio 内省、以及更成熟的 free-threading。Tornado 先把兼容性做稳,后面这些语言能力你才能放心往服务里塞。
2. 实验性支持 free-threading 从 Python 3.13 开始可以关掉 GIL。Tornado 6.5 对这种构建做了实验性支持,不过暂时没有现成的 wheel,需要源码编译。适合拿来试,还不适合当成默认部署方式。
3. 修了一个真实的安全问题 畸形的 multipart/form-data 以前会反复打警告,日志都能被打成拒绝服务。现在第一次出错就抛异常,每个请求只记一条日志,对应 CVE-2025-47287。后续 6.5.x 补丁还继续收紧了表单参数数量、multipart 解析和 Cookie 校验,升级时尽量跟到当前补丁。
4. HTTP 头更「像 RFC」请求行里不能再夹控制字符,非法方法名改回 400 而不是 405,Header 名字和 Host 的字符集都按 RFC 收紧。重复或缺失 Host(非 HTTP/1.0)会直接报错。这些改动对正常客户端无感,对乱写协议的扫描器和老旧代理会更不客气。
5. 类型标注补了一圈 get_argument / get_cookie、HTTPHeaders、UIModule.render 这些常用接口的 typing 更准了。用 mypy 的项目,升级后往往会少掉一批「明明能跑、类型却在抱怨」的噪声。
6. 几个小而实用的修复 Linux 抽象命名空间 Unix 套接字现在可以 bind_unix_socket;WebSocket 的 ping_interval / ping_timeout 逻辑修了,超时默认等于心跳间隔,也不再允许超时大于间隔;HTTPError 新增 get_message(),老的 log_message / args 属性标了废弃。
另外,已经废弃的 TwistedResolver 被直接删掉了——RFC 8482 之后它基本解析不了主流域名。需要非阻塞 DNS 可以看已经同样废弃的 caresresolver,大多数人用默认的线程解析器就行。
|


苏公网安备 32061202001004号
