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

版本0.13

警告

尚未发布。

不再支持生命周期已结束的Python版本。

保持对旧Python版本的支持会阻碍新功能的适配,并且没有实际用途。如果您需要对较旧的Python版本的支持,您可以继续使用Bottle-0.12。已测试和支持的Python版本的更新列表如下:

  • python 2.7(>=2.7.3)

  • Python 3.6

  • Python 3.7

  • Python 3.8

  • Python 3.9

  • PyPy 2.7

  • PyPy 3.6

  • PyPy 3.7

从0.12开始,对Python2.5的支持被标记为不推荐使用。我们决定更进一步,同时删除对2.6和3.1到3.5的支持,即使它在Bottle中从未被明确弃用。这意味着此版本是 not 在Python<2.7.3或<3.6环境中向后兼容。仍然使用这些旧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

  • 特里斯坦·扎琼克

  • 伏特隆

  • 威兰·霍夫曼

  • 僵尸

  • 蒂亚戈·阿维利诺