Pyramid1.4的新功能

本文解释了 Pyramid 与之前的版本相比,1.4版 Pyramid 1.3。它还记录了两个版本之间的向后不兼容以及添加到 Pyramid 1.4,以及软件依赖性更改和显著的文档添加。

主要功能添加

Pyramid1.4中的主要功能添加如下。

第三方谓词

简单的自定义JSON序列化

  • 视图现在可以返回自定义对象,通过定义一个 __json__ 对象类的方法。此方法应返回本机可序列化的值 json.dumps (例如整数、列表、字典、字符串等)。见 序列化自定义对象 更多信息。现在,JSON呈现器还允许定义自定义类型适配器,以便将未知对象转换为JSON序列化,以防无法添加 __json__ 方法返回对象。

部分Mako和变色龙模板渲染

  • Mako渲染器现在支持在资产规格中使用def名称。当def名称出现在资产规格中时,系统将在模板中呈现名为def的模板,而不是呈现整个模板。命名def的示例资产规格是 package:path/to/template#defname.mako . 这将呈现名为 defname 里面 template.mako 模板而不是呈现整个模板。在窗体中返回元组的旧方法 ('defname', {{}}) 支持从视图向后兼容。

  • 变色龙ZPT渲染器现在支持在资源规格中使用宏名称。当宏名称存在于资源规格中时,系统将渲染列为 define-macro 并返回结果,而不是呈现整个模板。示例资产规格: package:path/to/template#macroname.pt . 这将使宏定义为 macronametemplate.pt 模板而不是整个模板。

子请求支持

次要功能添加

  • pyramid.authentication.AuthTktAuthenticationPolicy 已更新以支持更新的哈希算法,如 sha512 . 如果可能的话,现有的应用程序应该考虑更新以提高默认MD5散列的安全性。

  • pyramid.config.Configurator.add_directive() 现在接受任意的可调用文件,如部分或对象实现 __call__ 但没有 __name____doc__ 属性。请参阅https://github.com/pylons/pyramid/issues/621和https://github.com/pylons/pyramid/pull/647。

  • 从本版本开始, request_method 视图/路由谓词在使用时也意味着 HEAD 使用时暗示 GET . 例如,使用 @view_config(request_method='GET') 相当于使用 @view_config(request_method=('GET', 'HEAD')) . 使用 @view_config(request_method=('GET', 'POST') 相当于使用 @view_config(request_method=('GET', 'HEAD', 'POST') . 这是因为head是get的一个变体,它省略了body,而webob在使用head时具有返回空body的特殊支持。

  • pyramid.config.Configurator.add_request_method() 已引入以支持使用任意可调用文件扩展请求对象。此方法扩展了现已弃用的文档 pyramid.config.Configurator.set_request_property() 通过支持方法和属性。这种方法还导致在请求的构造时间执行的代码比 set_request_property() .

  • 静态视图机械现在上升而不是返回 pyramid.httpexceptions.HTTPNotFoundpyramid.httpexceptions.HTTPMovedPermanently 异常,这样就可以被未找到的视图(和其他异常视图)捕获。

  • 当出现谓词不匹配异常(当由于谓词不起作用而没有视图匹配给定请求时,会看到异常),异常现在包含对不匹配谓词的文本描述。

  • pyramid.config.Configurator.add_permission() 向配置程序中添加了指令方法。该指令注册了一个独立的许可证,可以在Pyramid自省系统中自省。因此,在Pyramid顶部构建的框架可以使用 permissions 自省的类别数据,以构建运行系统支持的全面权限列表。在添加此方法之前,权限已经在此自省类别中注册,作为在 pyramid.config.Configurator.add_view() 调用,此方法只允许安排将权限放入 permissions 自省的类别,而不将其与关联视图一起命名。以下是使用 add_permission ::

    config = Configurator()
    config.add_permission('view')
    
  • 这个 pyramid.session.UnencryptedCookieSessionFactoryConfig() 函数现在接受 signed_serializesigned_deserialize 可用于影响会话编组方式的Hook(默认情况下,这是通过hmac+pickle完成的)。

  • pyramid.testing.DummyRequest 现在支持由 pyramid.util.InstancePropertyMixin 类如 set_property .

  • 通过添加请求属性和方法 pyramid.config.Configurator.add_request_method()pyramid.config.Configurator.set_request_property() 现在提供给粗花呢。

  • 通过添加请求属性和方法 pyramid.config.Configurator.add_request_method()pyramid.config.Configurator.set_request_property() 现在在从返回的请求对象中可用 pyramid.paster.bootstrap() .

  • request.context 环境要求期间 pyramid.paster.bootstrap() 如果在提供的请求上尚未设置上下文,则现在是根对象。

  • pyramid.decorator.reify 现在是API,已添加到API文档中。

  • 增加了 pyramid.testing.testConfig() 上下文管理器,可用于在测试中生成配置程序,例如 with testing.testConfig(...): .

  • 一个新的 pyramid.session.check_csrf_token() 增加了方便API功能。

  • A check_csrf 添加了视图谓词。例如,现在可以 config.add_view(someview, check_csrf=True) . 当谓词被选中时,如果 csrf_token 价值在 request.params 与请求会话中的CSRF令牌匹配,将允许执行该视图。否则,将不允许执行。

  • 添加 Base.metadata.bind = enginealchemy 脚手架,以便表的定义是强制性的将工作。

  • 关于脚手架文件章节的注释 .ini 文件夹。

  • 允许将多个值指定给 request_param 将谓词作为序列查看/路由。以前只允许使用单个字符串值。参见https://github.com/pylons/pyramid/pull/705

  • 在处添加了HTTP基本身份验证策略 pyramid.authentication.BasicAuthAuthenticationPolicy .

  • 这个 pyramid.config.Configurator.testing_securitypolicy() 方法现在返回它创建的策略对象。

  • 由创建的DummySecurityPolicy pyramid.config.Configurator.testing_securitypolicy() 现在设置 forgotten 政策价值(价值 True 当其 forget 方法被调用。

  • 由创建的DummySecurityPolicy pyramid.config.Configurator.testing_securitypolicy() 现在设置 remembered 策略值,即 principal 当它的 remember 方法被调用。

  • 新的 physical_path 视图谓词。如果指定,该值应该是一个字符串或元组,表示通过遍历找到的上下文的物理遍历路径,以便将该谓词匹配为true。例如: physical_path='/'physical_path='/a/b/c'physical_path=('', 'a', 'b', 'c') . 当某个对象被遍历到某个视图时,如果您希望始终潜在地显示该视图,这很有用,但是您不能确定它将是哪种类型的对象,因此不能使用 context 谓语。

  • 增加了一个 effective_principals 路由和视图谓词。

  • 不允许从 pyramid.security.authenticated_userid() 或者是由返回的主体列表之一的用户ID pyramid.security.effective_principals() 作为字符串之一 system.Everyonesystem.Authenticated 当任何内置授权策略 pyramid.authentication 正在使用中。这两个字符串是为Pyramid内部使用而保留的,它们将不再被接受为有效的用户ID。

  • 允许一个 _depth 参数 pyramid.view.view_config 这将允许其他软件对decorator进行有限的组合重用,这些软件希望提供与view_config非常类似的自定义decorator。

  • 允许将一个不可访问的修饰符传递给 pyramid.config.Configurator.add_view() . 这允许视图由多个装饰器包装,而不需要自己组合装饰器。

  • pyramid.security.view_execution_permitted() 用于返回 True 如果找不到视图。现在提出了 TypeError 在这种情况下,异常是不合理的,因为断言不存在的视图是允许执行的。请参阅https://github.com/pylons/pyramid/issues/299。

  • 小孢子增强,它预期 pyramid.response.Response 对象可能从视图返回。如果视图返回的对象的类是此类,则某些代码是快捷方式。类似的微优化被用于 pyramid.request.Request.is_response() .

  • 使所有变量都可以使用变量参数 p* 命令 (pservepshellpviews 等)在表格中 a=1 b=2 所以您可以在参数化中填充值 .ini 文件,例如 pshell etc/development.ini http_port=8080 .

  • 为了允许人们忽略订阅者可调用文件的未使用参数,并规范事件订阅者和订阅者谓词之间的关系,我们现在允许订阅者和订阅者谓词只接受一个 event 参数,即使它们已经订阅了涉及多个接口的通知。

向后不兼容

  • Pyramid路由器不再添加值 bfg.routes.routebfg.routes.matchdict 到请求的wsgi环境字典。这些值在 repoze.bfg 1.0(实际上是七个小版本)。如果代码依赖于这些值,请使用 request.matched_routerequest.matchdict 相反。

  • 不能再将环境字典直接传递给 pyramid.traversal.ResourceTreeTraverser.__call__ (阿卡 ModelGraphTraverser.__call__ )相反,您必须传递一个请求对象。自Pyramid1.1以来,传递环境而不是请求已生成拒绝警告。

  • 如果您使用 webob.request.LegacyRequest 作为请求工厂。legacyRequest类的实例具有 request.path_info 它返回一个字符串。这个Pyramid释放假设 request.path_info 将无条件为Unicode。

  • 功能来自 pyramid.chameleon_zptpyramid.chameleon_text 已命名 get_rendererget_templaterender_templaterender_template_to_response 已被删除。自Pyramid1.0以来,这些机构在进口时发出了反预测警告。使用 pyramid.renderers.get_renderer()pyramid.renderers.get_renderer().implementation()pyramid.renderers.render()pyramid.renderers.render_to_response() 而不是这些函数。

  • 这个 pyramid.configuration 模块已删除。自Pyramid1.0以来,它已被弃用,并在使用时打印了弃用警告。使用 pyramid.config 相反。

  • 这个 pyramid.paster.PyramidTemplate 已删除API。它自Pyramid1.1以来就被弃用,并发出了进口警告。如果您的代码依赖于此,请调整代码以导入 pyramid.scaffolds.PyramidTemplate 相反。

  • 这个 pyramid.settings.get_settings() 已删除API。自从Pyramid1.0以来,它一直在打印一个反预测警告。如果您的代码依赖于此API,请使用 pyramid.threadlocal.get_current_registry().settings 或者使用 settings 请求中可用的注册表属性 (request.registry.settings

  • 这些API来自 pyramid.testing 模块被移除。自Pyramid1.0以来,他们一直在打印弃用警告:

  • 在Pyramid1.3及以上版本中, __call__ 在执行任何完成的回调之前,调用了视图返回的响应对象的方法。从本版本开始, __call__ 调用响应对象的方法 之后 执行完成的回调。这是为了支持 pyramid.request.Request.invoke_subrequest() 特征。

废弃

  • 这个 pyramid.config.Configurator.set_request_property() 指令已被文档弃用。该方法仍然可用,但更具特点 pyramid.config.Configurator.add_request_method() 应在其位置使用(它具有所有相同的功能,但也可以使用方法扩展请求对象)。

  • pyramid.authentication.AuthTktAuthenticationPolicy 如果应用程序正在使用策略而没有显式传递 hashalg 参数。这是因为默认值是“md5”,理论上认为它会受到碰撞攻击。如果您真的想要“md5”,那么必须显式地指定它以消除警告。

文档增强功能

  • 增加了一个 升级金字塔 叙述性文件的章节。它描述了如何处理PyramidAPI的拒绝和删除,以及如何在运行测试和运行服务器时显示Pyramid生成的拒绝警告。

  • 增加了一个 调用子请求 叙述性文件的章节。

  • 所有使用的教程 pyramid.authentication.AuthTktAuthenticationPolicy 现在显式通过 sha512 作为一个 hashalg 参数。

  • 对叙述和API文档进行了许多清理和改进。

依赖关系更改

  • Pyramid现在需要Webob 1.2b3+(之前的Pyramid版本仅依赖于1.2dev+)。这是为了确保我们获得返回 request.path_info 作为文本。