Pyramid1.0的新功能

本文解释了Pyramid1.0版与前代版本相比的新特性, repoze.bfg 1.3。它还记录了两个版本之间的向后不兼容性,以及添加到Pyramid1.0的拒绝,以及软件依赖性更改和显著的文档添加。

主要功能添加

Pyramid1.0中增加的主要功能包括:

  • 与塔架项目的新名称和品牌关联。

  • bfg转换脚本

  • 脚手架改进

  • 术语更改

  • 更好的平台兼容性和支持

  • 直接内置支持Mako模板语言。

  • 内置会话支持。

  • 更新的URL调度功能

  • 更好的命令扩展性

  • ZCML外化

  • 在渲染期间更好地支持全局模板变量

  • 视图映射器

  • 测试系统改进

  • 身份验证支持改进

  • 文档改进

新名称和品牌

的名字 repoze.bfg 已更改为Pyramid。该项目现在也是一个新实体“塔架项目”的子项目。塔架项目是一个Web框架相关技术集合的项目名称。Pyramid是塔架项目的第一个项目。随着时间的推移,集合中的其他包也被添加了,例如对pylons 1用户以及前zope用户有用的支持包。Pyramid是两者的继承者 repoze.bfgPylons 版本1。

Pyramid代码基几乎完全来自 repoze.bfg 为了桥塔1的兼容性做了一些改动。

Pyramid在技术上是向后的,与 repoze.bfg ,因为它有一个新的包名称,所以旧的导入来自 repoze.bfg 如果您对现有模块不做任何操作,模块将失败。 repoze.bfg 应用。但是,在Pyramid上使用现有的bfg应用程序不需要做太多的工作。这是一种自动化,它将更改大多数导入语句和zcml声明。有关升级说明,请参阅https://docs.pylonsproject.org/projects/pyramid/en/1.0-branch/tutorials/bfg/index.html。

塔架1用户将需要做更多的工作来使用Pyramid,因为Pyramid与塔架不共享“DNA”。希望随着时间的推移,文档和升级代码将被开发出来,以帮助桥塔1用户更容易地过渡到Pyramid。

repoze.bfg 版本1.3将是它的最后一个主要版本。将对关键的错误修复进行小更新。塔架版本1将继续看到维修版本,以及。

回购项目将继续存在。Repoze将能够重新获得其最初的关注点:将Zope技术引入WSGi。流行的 repoze.bfg 因为它自己的网络框架阻碍了这一目标。

我们希望首先吸引人们的是塔架项目所体现的合作精神和发展社区的融合。牺牲一点主权并共同努力需要谦逊。相反,项目的复刻或分裂在开源世界中更为常见。我们觉得在“顶级”python web框架的空间中氧气有限,而且我们不通过过度拥挤来为python社区提供服务。通过合并 repoze.bfg 以及哲学上类似的桥塔社区,都获得了更多的观众和更大的成功机会。

bfg转换脚本

这个 bfg2pyramid 转换脚本对现有的 repoze.bfg 应用到Pyramid。该过程在“将BFG应用程序转换为Pyramid”中进行了描述。

脚手架改进

  • 脚手架现在有了更好的CSS和图形。

  • 这个 development.ini 由所有脚手架生成的,现在配置为默认使用WebError交互式异常调试器。

  • 所有脚手架都已规范化:现在每个脚手架都使用名称 main 表示返回wsgi应用程序的函数,现在每个函数的development.ini样式都大致相同。

  • 所有现有的脚手架现在都使用“强制”配置。 (starterroutesalchemyalchemyzodb )而不是ZCML配置。

  • 这个 pyramid_zodbroutesalchemypyramid_alchemy 当配置 repoze.tm2 中的事务管理器 development.ini . 这将防止在响应状态代码在400或500范围内时提交事务。

    参见

    另请参见https://repozetm2.readthedocs.io/en/latest/using-a-commit-veto。

术语更改

  • 以前被称为“模型”的Pyramid概念现在被称为“资源”。因此,已生成以下API重命名。旧名称的向后兼容性垫片在所有情况下都保持原位:

    pyramid.url.model_url ->
                      pyramid.url.resource_url
    
    pyramid.traversal.find_model ->
                      pyramid.url.find_resource
    
    pyramid.traversal.model_path ->
                      pyramid.traversal.resource_path
    
    pyramid.traversal.model_path_tuple ->
                      pyramid.traversal.resource_path_tuple
    
    pyramid.traversal.ModelGraphTraverser ->
                      pyramid.traversal.ResourceTreeTraverser
    
    pyramid.config.Configurator.testing_models ->
                      pyramid.config.Configurator.testing_resources
    
    pyramid.testing.registerModels ->
                      pyramid.testing.registerResources
    
    pyramid.testing.DummyModel ->
                      pyramid.testing.DummyResource
    
  • 以前提到“模型”的所有文档现在都提到“资源”。

  • 这个 starter 脚手架现在有一个 resources.py 模块而不是 models.py 模块。

  • 各种API的位置参数名称已从 modelresource .

  • 以前被称为“资源”的Pyramid概念现在被称为“资产”。因此,进行了以下API更改。如有必要,向后兼容性垫片已保留到位:

    pyramid.config.Configurator.absolute_resource_spec ->
                      pyramid.config.Configurator.absolute_asset_spec
    
    pyramid.config.Configurator.override_resource ->
                      pyramid.config.Configurator.override_asset
    
  • (非API)模块以前称为 pyramid.resource 现在被称为 pyramid.asset .

  • 以前提到“资源规格”的所有文档现在都提到“资产规格”。

  • 以前称为 BFG_RELOAD_RESOURCES (EnVaR)或 reload_resources (配置文件)现在分别称为 PYRAMID_RELOAD_ASSETSreload_assets .

更好的平台兼容性和支持

我们已经让Pyramid的测试套件通过了Jython和Pypy。不过,变色龙也不适用于这两个平台,所以您需要在这些平台上使用mako或jinja2模板。

会议

Pyramid现在有内置的会话支持,记录在 会议 . 会话实现是可插入的。它还提供了Flash消息和跨站点脚本保护功能。

使用 request.session 现在返回(类似字典的)会话对象,如果 session factory 已配置。

存在配置器构造函数的新参数: session_factory 配置器上存在一种新方法: pyramid.config.Configurator.set_session_factory() .

鲭鲨

除了变色龙模板,Pyramid现在还提供内置支持 Mako 模板。见 可用的附加模板系统绑定 更多信息。

URL调度

  • URL调度现在允许替换标记位于模式中的任何位置,而不是紧跟 / .

  • URL调度现在使用表单 {{marker}} 在路线图中表示替换标记,而不是 :marker . 为了向后兼容,仍然接受旧的冒号样式标记语法。新格式允许使用该标记位置的正则表达式,而不是默认的 [^/]+ ,例如 {{marker:\d+}} 现在有效,要求标记为数字。

  • 添加了新的API pyramid.url.current_route_url() ,它根据“当前”路由(如果有)及其matchdict值计算URL。

  • 增加了一个 paster proute 显示路由表摘要的命令。参见标题为 proutes :显示所有应用程序路由 .

  • 补充 debug_routematch 配置设置(可在 .ini 文件)记录匹配的路由,包括matchdict和谓词。

  • 添加 pyramid.url.route_path() API,允许人们生成相对的URL。打电话 route_path 和打电话一样吗 pyramid.url.route_url() 有了参数 _app_url 等于空字符串。

  • 添加 pyramid.request.Request.route_path() 应用程序编程接口。这是调用 pyramid.url.route_url() .

  • 添加了类变量 matchdictmatched_routepyramid.request.Request . 每个设置为 None 当请求期间路由不匹配时。

ZCML外化

  • 这个 load_zcml 配置器的方法已从Pyramid核心中删除。加载zcml现在是 pyramid_zcml 软件包,可以从pypi下载。见 documentation for the package ,它描述了如何将配置语句添加到 main 阻止重新加入此方法。您还需要添加 install_requires 依赖于 pyramid_zcml 分发到您的 setup.py 文件。

  • “声明性配置”叙述章节已被删除(它被移到 pyramid_zcml 包装)。

  • 在叙述章节中对zcml的大多数引用都被删除或重定向到 pyramid_zcml 位置。

  • 这个 starter_zcml 贴纸脚手架已移到 pyramid_zcml 包。

强制两相配置

为了支持应用程序的可扩展性, Pyramid Configurator 默认情况下,现在检测配置冲突,并允许您强制包含来自其他包或模块的配置。默认情况下,它还将在两个单独的阶段执行配置。这允许您在某些情况下忽略相对配置语句排序。见 高级配置 更多信息。

这个 pyramid.config.Configurator.add_directive() 允许框架扩展器向配置器添加方法,这允许扩展器避免将配置器子类化,而只是添加方法。见 通过向配置器添加方法 add_directive 更多信息。

周围的应用程序配置 config.begin()config.end() 不再需要。所有脚手架都已更改为不再调用这些函数。

在渲染期间更好地支持全局模板变量

名为的新事件类型 pyramid.interfaces.IBeforeRender 现在作为事件发送,然后调用渲染器。应用程序现在可以订阅 IBeforeRender 事件类型,以便在将渲染器全局数据集传递给渲染器之前对其进行内省和修改。事件对象iself有一个类似字典的接口,可以用于此目的。例如::

from repoze.events import subscriber
from pyramid.interfaces import IRendererGlobalsEvent

@subscriber(IRendererGlobalsEvent)
def add_global(event):
    event['mykey'] = 'foo'

视图映射器

已提取“视图映射器”子系统,该子系统允许框架扩展程序控制如何构造和调用视图可调用文件。此功能对“平民”不有用,只对扩展编写器有用。见 使用视图映射器 更多信息。

测试支持改进

这个 pyramid.testing.setUp()pyramid.testing.tearDown() API尚未预先准备好。它们现在是测试配置的规范设置和拆卸API,取代了配置器的“直接”创建。这是一个设计用来提供一个外观的变更,它可以防止将来的配置程序被拒绝。

身份验证支持改进

文档改进

  • 凯西·邓肯,一个好朋友,一位优秀的技术作家,给了我们专业编辑整个Pyramid文档集的天赋。文档中的任何错误都是开发团队的,所有的改进都是他的。

  • “资源位置和视图查找”一章已被Rob Miller的“关于遍历的很多麻烦”(最初发布在http s://web.archive.org/web/20150603023226/http://blog.nonequitarian.org/2010/much ado about traversal/)的变体所取代。

  • 许多用户贡献了文档修复和改进,包括Ben Bangert、Blaise Laflamme、Rob Miller、Mike Orr、Carlos de la Guardia、Paul Everitt、Tres Seaver、John Shipman、Marius Gedminas、Chris Rossi、Joachim Krebs、Xavier Spriet、Reed O'Brien、William Chambers、Charlie Choiniere和Jamaludin Ahmad。

次要功能添加

  • 这个 settings 传递给配置程序的字典现在可用作 config.registry.settings 在配置代码和 request.registry.settings 在视图代码中)。

  • pyramid.config.Configurator.add_view() 现在接受 decorator 关键字参数,一个可调用项,它将在将视图可调用项添加到注册表之前修饰该视图。

  • 允许在请求时通过名为的请求属性重写视图注册期间提供的静态呈现器 override_renderer ,它应该是以前注册的渲染器的名称。使用现有渲染视图提供“全向呈现”RPC很有用。

  • 如果资源实现 __resource_url__ 方法,它将作为调用 pyramid.url.resource_url() 函数生成URL,覆盖默认逻辑。见 生成资源的URL 更多信息。

  • 名字 registry 现在可在 pshell 默认环境。它是应用程序注册表对象。

  • 通过捕获 NotImplementedError 进口 simplejsondjango.utils .

  • 增加了 pyramid.httpexceptions 模块,它是 webob.exc 模块。

  • 新类: pyramid.response.Response . 这是一个纯粹的表面 webob.Response (旧代码不需要更改就可以使用这个外观,它的存在主要是为了虚荣和文档生成的目的)。

  • 请求现在具有一个新属性: tmpl_context 为了塔架用户的利益。

  • 的新API方法 pyramid.request.Requestmodel_urlroute_urlstatic_url . 这些是它们各自在 pyramid.url .

向后不兼容

  • 当A pyramid.exceptions.Forbidden 出现错误,其状态代码为 403 Forbidden . 以前是这样的 401 Unauthorized ,以便向后兼容 repoze.bfg . 此更改将给使用Pyramid的用户带来问题 repoze.who ,截取 401 Unauthorized 默认情况下,但允许 403 Forbidden 通过。这些部署需要配置 repoze.who 对…也有反应 403 Forbidden . 为此,请使用repoze。 challenge_decider 看起来像这样:

    import zope.interface
    from repoze.who.interfaces import IChallengeDecider
    
    def challenge_decider(environ, status, headers):
        return status.startswith('403') or status.startswith('401')
    zope.interface.directlyProvides(challenge_decider, IChallengeDecider)
    
  • 这个 paster bfgshell 命令现在称为 paster pshell .

  • 不再有 IDebugLogger 对象注册为名称为的命名实用程序 repoze.bfg.debug .

  • 这些已弃用的API已被删除: pyramid.testing.registerViewPermissionpyramid.testing.registerRoutesMapperpyramid.request.get_requestpyramid.security.Unauthorizedpyramid.view.view_execution_permittedpyramid.view.NotFound

  • 所有内置金星装饰师的金星“类别”(例如 subscriber and view_config/bfg_view 现在 pyramid 而不是 bfg .

  • 这个 pyramid.renderers.rendered_response 功能已删除;使用 pyramid.renderers.render_to_response() 相反。

  • 渲染器工厂现在接受 渲染器信息对象 而不是绝对资源规范或绝对路径。对象具有以下属性: name (the renderer= 价值) package (找到呈现程序配置语句时的“当前包”), type :渲染器类型, registry :当前注册表,以及 settings :部署设置字典。第三方 repoze.bfg 必须移植到Pyramid的渲染器实现需要考虑到这一点。此更改主要是为了支持更灵活的Mako模板呈现。

  • 钥匙的存在 repoze.bfg.message 在wsgi环境中,当发生异常时,现在不推荐使用。相反,依赖此环境值的代码应该使用 exception 请求的属性(例如 request.exception[0] )检索消息。

  • 价值观 bfg_localizerbfg_locale_name 在国际化期间为了缓存而保留在请求中的永远不是API。但是这些已经变成了 localizerlocale_name ,分别。

  • 默认值 cookie_name 价值观 pyramid.authentication.AuthTktAuthenticationPolicy 现在默认为 auth_tkt (过去它默认为 repoze.bfg.auth_tkt

  • 这个 pyramid.testing.zcml_configure() API已被删除。从那时起,它就被广告称为已被删除。 repoze.bfg 1.2A1,但实际上没有。

  • 所有环境变量的前缀 BFG_ 现在前缀为 PYRAMID_ (例如) BFG_DEBUG_NOTFOUND 现在是 PYRAMID_DEBUG_NOTFOUND

  • 自从 pyramid.interfaces.IAuthenticationPolicy 接口现在指定策略实现必须实现 unauthenticated_userid 方法,所有第三方自定义身份验证策略现在都必须实现此方法。但是,只有当名为 pyramid.security.unauthenticated_userid() 是被调用的,所以如果您不调用它,您将不会注意到任何问题。

  • 这个 configure_zcml 部署设置中的设置(在 **settings 传到Pyramid main 功能)不再有任何意义。

  • 这个 make_app 函数已从中删除 pyramid.router 模块。它继续生活在 pyramid_zcml 包。这就离开了 pyramid.router 没有任何API函数的模块。

折旧和行为差异

  • pyramid.configuration.Configurator 现已弃用。使用 pyramid.config.Configurator ,传递其构造函数 autocommit=True 相反。这个 pyramid.configuration.Configurator 别名的寿命将很长,因为每个应用程序都会使用它,但是它的导入现在会发出一个拒绝警告。这个 pyramid.config.Configurator 类的API与 pyramid.configuration.Configurator 类,它的意思是替换,但默认情况下它是 non-autocommitting 配置器。现在已弃用 pyramid.configuration.Configurator 将在每次调用配置方法时自动提交。这个 pyramid.configuration 模块仍保留,但已弃用。使用 pyramid.config 相反。

  • 这个 pyramid.settings.get_settings() API现已弃用。使用 pyramid.threadlocals.get_current_registry().settings 或者使用 settings 请求中可用的注册表属性 (request.registry.settings

  • 以前称为 pyramid.view.bfg_view 现在最正式的是 pyramid.view.view_config 在文档和脚手架中。

  • 获得 settings 对象通孔 registry.{{get|query}}Utility(ISettings) 现已弃用。相反,获得 settings 对象通过 registry.settings 属性。向注册表对象添加了向后兼容性填充程序,以便在以下情况下将设置对象注册为ISettings实用程序 setattr(registry, 'settings', foo) 已调用,但将在以后的版本中删除。

  • 获得 settings 对象通孔 pyramid.settings.get_settings() 现已弃用。把它作为 settings 立即获取注册表的属性(通过 pyramid.threadlocal.get_registry() 或作为 request.registry

依赖关系更改

  • 取决于金星>=0.5(用于扫描冲突异常装饰)。

文档增强功能

  • 增加了一个 pyramid.httpexceptions API文档章节。

  • 增加了一个 pyramid.session API文档章节。

  • 为添加了API章节 pyramid.response 模块。

  • 增加了一个 会议 叙述性文件章节。

  • 先前提到的所有文件 webob.Response 现在使用 pyramid.response.Response 相反。

  • 已经对文档进行了大修,以使用强制配置,将声明性配置(ZCML)解释移动到外部包中, pyramid_zcml .

  • 远离的 zodbsessions 教程章节。它仍然很有用,但是我们现在有了一个与之竞争的会话工厂抽象,并且在两种方法上维护文档会分散注意力。

  • 添加了一个示例 WebTest 测试叙述章节的功能测试 创建功能测试 .

  • 通过调用与资源相关的API的示例扩展了参考资料一章。

  • 添加“Pyramid提供了一种以上的方法来完成它”来设计防御文档。

  • (弱)“将CMF应用程序转换为Pyramid”教程已从教程部分中删除。它被移到 pyramid_tutorials Github存储库,位于https://github.com/pylons/pyramid-tutorials/commit/38351561b54a2b07e3af5b4f83964f72d0c05e。

  • 将“使用ZODB与Zeo”和“使用Pyramid内的repoze.catalog”教程移出核心文档,并移入Pyramid教程网站(https://github.com/pylons/pyramid_tutorials/commit/86cfd11d8a4093b39cedc86fc6f005db4bccb00)。

  • 已删除的API文档 pyramid.testing API命名 registerDummySecurityPolicyregisterResourcesregisterModelsregisterEventListenerregisterTemplateRendererregisterDummyRendererregisterViewregisterUtilityregisterAdapterregisterSubscriberregisterRouteregisterSettings .