发布摘要和更改历史(不译)

版本0.13

警告

尚未发布。

放弃了对python 2.5、2.6、3.1、3.2和3.3的支持

这三个Python版本不再被Python软件基金会维护,并在很长一段时间前到达了他们的生命终点。保持对古代 Python 版本的支持会阻碍新特性的适应,并且没有真正的用途。即使Debian7(喘息)和Ubuntu12.4(精确),都已经过时了,已经使用了python 2.7.3和3.2.3。因此,我们决定放弃对python 2.5、2.6、3.1、3.2和3.1的支持。测试和支持的Python版本的更新列表如下:

  • python 2.7(>=2.7.3)
  • Python 3.4
  • Python 3.5
  • Python 3.6
  • Python 3.7
  • PYPY 5.3版
  • PYPY3 2.4型

自0.12以来,对python 2.5的支持被标记为已弃用。我们决定更进一步,并删除2.6、3.1、3.2和3.3支持,即使它从未在瓶子中明确反对。这意味着这个版本是 not 在python<2.7或<3.4环境中向后兼容。对于仍然使用这些旧的python版本的发行版或系统,维护人员不应该更新到瓶子0.13,而是坚持使用0.12。

稳定的原料药

  • 记录的API ConfigDict 类现在被认为是稳定的,可以使用了。

不赞成的API

  • 旧的路由语法 (/hello/:name )更具可读性和灵活性 /hello/<name> 语法。
  • Bottle.mount() 现在识别瓶子实例,并警告与新安装行为不兼容的参数。旧行为(将应用程序作为wsgi可调用挂载)仍然有效,并自动用作回退。
  • 无证件者 local_property() 助手现在已被弃用。
  • google app engine的服务器适配器不再有用,标记为已弃用。
  • 瓶子使用pickle将任意对象存储到签名的cookie中。这是安全的,只要签名密钥仍然是秘密的。不幸的是,人们总是倾向于将带有签名密钥的代码推送到Github,所以我们决定从瓶子中删除pickle支持。如果值不是字符串,签名的cookie现在将发出一个取消预测警告,对非字符串值的支持将在0.14中删除。全球 cookie_encode()cookie_decode()is_cookie_encoded() 现在也不赞成。如果您正在使用此功能,请考虑在将对象存储到cookie中之前使用json对其进行序列化,或者切换到存储数据服务器端而不是客户端的会话系统。

已删除的API(从0.12起已弃用)

  • 使用旧API的插件 (api=1 或者没有api属性)将不再工作。
  • 参数顺序 Bottle.mount() 在0.10中更改。旧订单现在将导致错误而不是警告。
  • 这个 ConfigDict 课程在0.11引入,在0.12期间更改。这些变化现在是最终的。
    • 由于高开销和有限的可用性,属性访问和分配被删除。
    • 已删除命名空间子实例创建。 config["a"]["b"] 管理费用高,效益不大 config["a.b"] .
    • ConfigDict 实例不再可调用。这是一条捷径 ConfigDict.update() .
    • ConfigDict 构造函数不再接受任何参数。使用 load_* 方法。
  • 瓶子0.12改变了简单模板引擎的一些方面。这些更改现在是最终的,旧的语法现在可以工作更长时间。
    • 魔法 {{{{rebase()}}}} 呼叫被替换为 base 变量。例子: {{{{base}}}}
    • 在stpl模板中,“rebase”和“include”关键字替换为0.12中的函数。
    • 不再识别PEP-263编码字符串。模板始终是UTF-8。
  • “geventsockatino”服务器适配器已被删除,恕不另行通知。无论如何,它都不起作用。

变化

更新时,这些更改可能需要特别注意。

  • 签名cookie现在默认使用更强大的HMAC算法。这将导致旧cookie在更新后显示为无效。传递显式 digestmod=hashlib.md5Request.get_cookie()Response.set_cookie() 以获得旧的行为。

其他改进

  • bottle()实例现在是上下文管理器。如果在WITH语句中使用,则默认应用程序将更改为特定实例,并且可以使用许多实例方法的快捷方式。
  • 为添加了支持 PATCH 请求和 Bottle.patch() 装饰者。
  • 补充 aiohttpuvloop 服务器适配器。
  • 为json或ini文件中的config添加了命令行参数。
  • Bottle.mount() 现在识别 Bottle 并且,与其他WSGi应用程序相比,装载它们的开销要少得多。
  • 这个 Request.json 属性现在接受 application/json-rpc 请求。
  • static_file() 获得支持 ETag 标题。它将生成etags并识别 If-None-Match 标题。
  • Jinja2模板将产生比以前更好的错误消息。

版本0.12

  • 新的SimpleTemplate解析器实现
    • 支持多行代码块 (<% ... %>
    • 关键词 includerebase 现在是函数,可以接受变量模板名称。
  • 新的 BaseRequest.route 属性返回 Route 最初与请求匹配的。
  • 移除 BaseRequest.MAX_PARAMS 限制。cpythons dict()实现中的哈希冲突错误在一年前就被修复了。如果您仍在生产中使用python 2.5,请考虑升级,或者至少确保从您的分发服务器上修复了安全性。
  • 新的 ConfigDict API(见 配置文件(初稿)

更多信息请参见 development blog post .

版本0.11

  • 对python 2.x和3.x语法的本机支持。不再需要运行2to3。
  • 支持部分下载 (Range 标题)在 static_file() .
  • 新的 ResourceManager 接口帮助定位与应用程序捆绑的文件。
  • 为添加了服务器适配器 waitress .
  • 新的 Bottle.merge() 方法将所有路由从一个应用程序安装到另一个应用程序。
  • 新的 BaseRequest.app 属性获取处理请求的应用程序对象。
  • 补充 FormsDict.decode() 获取所有Unicode版本(WTForms需要)。
  • MultiDict 子类现在可以腌制。

API更改

  • Response.status 是一个读写属性,可以为其分配数字状态代码或带有原因短语的状态字符串 (200 OK )。返回值现在是一个字符串,以便更好地匹配现有的API(webob、werkzeug)。要完全清楚,可以使用只读属性 BaseResponse.status_codeBaseResponse.status_line .

API折旧

  • SimpleTALTemplate 现在正在贬值。似乎没有需求。

版本0.10

  • 插件API v2
    • 要使用新的API,请设置 Plugin.api2 .
    • Plugin.apply() 接收 Route 对象,而不是作为第二个参数的上下文字典。新对象提供了一些附加信息,将来可能会扩展。
    • 插件名称现在被认为是唯一的。已安装给定路由上具有给定名称的最顶层插件,所有其他具有相同名称的插件将被静默忽略。
  • 请求/响应对象
  • 模板
    • 向处理未定义变量的SimpleTemplate默认命名空间添加了三个新函数: stpl.defined()stpl.get()stpl.setdefault() .
    • SimpleTemplate的默认转义函数现在额外转义单引号和双引号。
  • 路由
    • 新的路由语法(例如 /object/<id:int> )以及对路由通配符过滤器的支持。
    • 四个新的通配符筛选器: intfloatpathre .
  • 其他变化
    • 添加了用于加载应用程序和启动服务器的命令行界面。
    • 介绍了一个 ConfigDict 这使得访问配置更加容易(属性访问和自动扩展名称空间)。
    • 增加了对原始wsgi应用程序的支持 Bottle.mount() .
    • Bottle.mount() 参数顺序已更改。
    • Bottle.route() 现在,为 callback 参数。
    • 放下了Gunicorn 0.8支架。当前支持的版本为0.13。
    • 向Gunicorn服务器添加了自定义选项。
    • 最后放弃了对类型过滤器的支持。替换为所需的自定义插件。

版本0.9

有什么新消息吗?

  • 全新的插件API。参见 插件插件开发指南 有关详细信息。
  • 这个 route() 装饰师有很多新特性。参见 Bottle.route() 有关详细信息。
  • 的新服务器适配器 geventmeinheldbjoern .
  • 支持简单模板。
  • 在调试模式下更好地处理mako模板的运行时异常。
  • 大量的文档、修复和小的改进。
  • 一个新的 Request.urlparts 财产。

性能改进

  • 这个 Router 现在是特殊情况 wsgi.run_once 加速CGI的环境。
  • 将模块加载时间缩短约30%,并优化模板分析器。参见 8ccb2df72a7cb14b9a 有关详细信息。
  • 在谷歌应用引擎上支持“应用缓存”。参见 af93ec .
  • 一些很少使用或不推荐使用的功能现在是插件,可以避免不使用该功能时的开销。

API更改

这个版本主要是向后兼容的,但是一些API现在被标记为不推荐使用,将在下一个版本中被删除。最值得注意的是:

  • 这个 static 路由参数已弃用。你可以用反斜杠来逃脱野牌。
  • 不推荐使用基于类型的输出筛选器。它们很容易被插件替换。

版本0.8

API更改

这些更改可能会破坏与以前版本的兼容性。

  • 内置的键/值数据库不再可用。从0.6.4开始标记为已弃用
  • 路由语法和行为发生了变化。
    • 正则表达式必须用 # .在0.6中,允许正则表达式中不存在的所有非字母数字字符。
    • 不属于路由通配符的正则表达式将自动转义。您不再需要转义点或其他常规控制字符。在0.6中,整个URL被解释为正则表达式。可以使用匿名通配符 (/index:#(\.html)?# )达到类似的行为。
  • 这个 BreakTheBottle 例外情况消失了。使用 HTTPResponse 相反。
  • 这个 SimpleTemplate 引擎转义HTML特殊字符 {{{{bad_html}}}} 表达式自动。使用新的 {{{{!good_html}}}} 获取旧行为的语法(不转义)。
  • 这个 SimpleTemplate 引擎返回Unicode字符串而不是字节字符串列表。
  • bottle.optimize() 自动路径优化已经过时。
  • 一些函数和属性已重命名:
    • Request._environ is now Request.environ
    • Response.header is now Response.headers
    • default_app() 已过时。使用 app() 相反。
  • 默认值 redirect() 代码从307更改为303。
  • 拆下的支架 @default . 使用 @error(404) 相反。

新特点

这是新功能和改进功能的不完整列表。

  • 这个 Request 对象获得了新属性: Request.bodyRequest.authRequest.urlRequest.headerRequest.formsRequest.files .
  • 这个 Response.set_cookie()Request.get_cookie() 方法现在可以对Python对象进行编码和解码。这叫A 安全cookie 因为编码值是有符号的,并且不受客户端更改的保护。允许所有可酸洗的数据结构。
  • 新的 Router 类大大提高了具有大量动态路由的设置的性能,并支持命名路由(命名路由+dict=url字符串)。
  • 现在可以(并建议)返回 HTTPErrorHTTPResponse 实例或其他异常对象,而不是引发它们。
  • 新功能 static_file() 等于 send_file() 但返回A HTTPResponseHTTPError 而不是提高它。 send_file() 被贬低。
  • 新的 get()post()put()delete() 装饰工。
  • 这个 SimpleTemplate 引擎得到了完整的Unicode支持。
  • 很多非关键的错误修复。

贡献者

瓶子由marcel hellkamp<marc@bottlepy.org>编写和维护。

感谢所有发现错误、发送补丁、传播消息、在邮件列表中互相帮助并使这个项目成为可能的人。我希望下面(按字母顺序排序)的列表是完整的。如果你错过了名单上的名字(或希望删除你的名字),请 tell me 或者自己添加。

  • 阿卡萨朱
  • 亚当·R·史密斯
  • 亚历克赛·博岑科夫
  • 亚历克西斯·达博维尔
  • 安东·I·西波斯
  • 安东·科勒奇金
  • APEXI200SX公司
  • 蚜虫
  • BillMa
  • 布拉德·格林利
  • 布兰登·吉尔摩
  • 布兰科·武克利奇
  • 布赖恩·西拉科夫斯基
  • 布赖恩威克曼
  • 卡尔·谢伦伯格
  • 达米安·德戈瓦
  • 大卫·巴克斯顿
  • 杜安·约翰逊
  • 福卡迈尔
  • 弗兰克·墨菲
  • 弗雷德里克·朱诺德
  • 黄金制造厂3012
  • 格雷格·米尔比
  • 黄体酮
  • 伊恩·戴维斯
  • 伊塔玛·纳布瑞奇
  • 西尔维奥
  • 杰米·默多克
  • 杰夫·尼科尔斯
  • 杰里米·凯利
  • 乔格斯特
  • 约翰内斯·克拉姆夫
  • 乔纳斯·哈格
  • 乔舒亚·罗斯林
  • 朱德森·尼尔
  • 卡尔
  • 凯文·祖伯
  • 海怪
  • 凯尔·弗里茨
  • M35型
  • 马科斯·内维斯
  • 马斯克林
  • 迈克尔·拉布
  • 迈克尔·苏利埃
  • reddit
  • 尼古拉斯·万霍伦
  • 奥兹N提拉姆
  • 罗伯特·罗林斯
  • 罗杰雷恩斯
  • RWxRWX型
  • 圣地亚哥加拉
  • 肖恩·M·柯林斯
  • 塞巴斯蒂安·沃尔拉斯
  • 赛斯
  • 西格德·H·格斯布罗
  • 斯图尔特·拉卡姆
  • 孙宁
  • Tom_s A.Schertel
  • 特里斯坦·扎琼克
  • 伏特隆
  • 威兰·霍夫曼
  • 僵尸
  • 蒂亚戈·阿维利诺