Pyramid1.4的新功能¶
本文解释了 Pyramid 与之前的版本相比,1.4版 Pyramid 1.3。它还记录了两个版本之间的向后不兼容以及添加到 Pyramid 1.4,以及软件依赖性更改和显著的文档添加。
主要功能添加¶
Pyramid1.4中的主要功能添加如下。
第三方谓词¶
现在可以添加第三方自定义视图、路由和订阅服务器谓词,供视图作者通过
pyramid.config.Configurator.add_view_predicate()
,pyramid.config.Configurator.add_route_predicate()
和pyramid.config.Configurator.add_subscriber_predicate()
. 例如,这样做:config.add_view_predicate('abc', my.package.ABCPredicate)
可能允许视图作者在配置该谓词的应用程序中执行此操作:
@view_config(abc=1)
类似的特征存在于
pyramid.config.Configurator.add_route()
和pyramid.config.Configurator.add_subscriber()
. 见 添加自定义视图、路由或订阅服务器谓词 更多信息。
简单的自定义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
. 这将使宏定义为macroname
内template.pt
模板而不是整个模板。
子请求支持¶
开发人员可以使用
pyramid.request.Request.invoke_subrequest()
应用程序编程接口。这允许开发人员通过在不同的可调用视图中发出子请求,从一个可调用视图获取响应。见 调用子请求 更多信息。
次要功能添加¶
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.HTTPNotFound
和pyramid.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_serialize
和signed_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 = engine
到alchemy
脚手架,以便表的定义是强制性的将工作。关于脚手架文件章节的注释
.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()
或者是由返回的主体列表之一的用户IDpyramid.security.effective_principals()
作为字符串之一system.Everyone
或system.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*
命令 (pserve
,pshell
,pviews
等)在表格中a=1 b=2
所以您可以在参数化中填充值.ini
文件,例如pshell etc/development.ini http_port=8080
.为了允许人们忽略订阅者可调用文件的未使用参数,并规范事件订阅者和订阅者谓词之间的关系,我们现在允许订阅者和订阅者谓词只接受一个
event
参数,即使它们已经订阅了涉及多个接口的通知。
向后不兼容¶
Pyramid路由器不再添加值
bfg.routes.route
或bfg.routes.matchdict
到请求的wsgi环境字典。这些值在repoze.bfg
1.0(实际上是七个小版本)。如果代码依赖于这些值,请使用request.matched_route
和request.matchdict
相反。不能再将环境字典直接传递给
pyramid.traversal.ResourceTreeTraverser.__call__
(阿卡ModelGraphTraverser.__call__
)相反,您必须传递一个请求对象。自Pyramid1.1以来,传递环境而不是请求已生成拒绝警告。如果您使用
webob.request.LegacyRequest
作为请求工厂。legacyRequest类的实例具有request.path_info
它返回一个字符串。这个Pyramid释放假设request.path_info
将无条件为Unicode。功能来自
pyramid.chameleon_zpt
和pyramid.chameleon_text
已命名get_renderer
,get_template
,render_template
和render_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以来,他们一直在打印弃用警告:registerDummySecurityPolicy
使用pyramid.config.Configurator.testing_securitypolicy()
相反。registerResources
(阿卡registerModels
)、使用pyramid.config.Configurator.testing_resources()
相反。registerEventListener
使用pyramid.config.Configurator.testing_add_subscriber()
相反。registerTemplateRenderer
(阿卡registerDummyRenderer
)、使用pyramid.config.Configurator.testing_add_renderer()
相反。registerView
使用pyramid.config.Configurator.add_view()
相反。registerUtility
使用pyramid.config.Configurator.registry.registerUtility()
相反。registerAdapter
使用pyramid.config.Configurator.registry.registerAdapter()
相反。registerSubscriber
使用pyramid.config.Configurator.add_subscriber()
相反。registerRoute
使用pyramid.config.Configurator.add_route()
相反。registerSettings
使用pyramid.config.Configurator.add_settings()
相反。
在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
作为文本。