Pyramid1.1的新功能¶
本文解释了1.1版Pyramid与其前身相比的新特性, Pyramid 1。它还记录了两个版本之间的向后不兼容性,以及添加到Pyramid1.1中的拒绝,以及软件依赖性更改和显著的文档添加。
术语更改¶
Pyramid文档使用的术语“模板”用于指“粘贴模板”和“渲染模板”(由渲染引擎创建的模板)。即Mako、Chameleon、Jinja等)。“粘贴模板”现在将被称为“脚手架”,而“渲染模板”的名称将保留为“模板”。
主要功能添加¶
Pyramid1.1中增加的主要功能有:
支持
request.response
属性。新视图自省功能:
paster pviews
.支持“静态”路由。
默认HTTP异常视图。
http_cache
视图配置参数导致Pyramid设置HTTP缓存头。使编写在 Pyramid 环境。
request.response
¶
的实例
pyramid.request.Request
类现在有一个response
属性。传递给视图的对象可调用为
request
是的实例pyramid.request.Request
.request.response
是类的实例pyramid.response.Response
. 查看配置了 renderer 将此响应对象返回Pyramid路由器。因此,使用View Callable的渲染器中的代码可以设置响应属性,例如request.response.content_type
(在它们返回之前,例如将字典返回到渲染器),这将影响可调用视图的HTTP返回值。request.response
也可以在未配置为使用渲染器的视图可调用代码中使用。例如,可调用视图可能会request.response.body = '123'; return request.response
. 但是,由生成的响应对象request.response
必须是 返回 当渲染器不在运行中以对HTTP响应产生任何影响时(它不是“全局”响应,对它的修改不会以某种方式合并到单独返回的响应对象中)。这个
request.response
对象被懒惰地创建,所以它的引入不会对性能产生负面影响。
paster pviews
¶
名为
paster pviews
加入。此命令打印给定路径的潜在匹配视图的摘要。见标题部分 pviews :显示给定URL的匹配视图 更多信息。
静态路由¶
这个
add_route
配置器的方法现在接受static
参数。如果这个论点是True
,在处理请求时,不会考虑将添加的路由进行匹配。相反,它只对通过route_url
和route_path
. 见标题部分 静态路由 更多信息。
默认HTTP异常视图¶
接口的默认异常视图
pyramid.interfaces.IExceptionResponse
现在默认注册。这意味着从中导入的任何异常类的实例pyramid.httpexceptions
(如HTTPFound
)现在可以从视图代码内引发;引发时,此异常视图将把异常呈现给响应。要允许配置此功能,请 Configurator 现在接受一个名为
exceptionresponse_view
. 默认情况下,此参数由默认的异常视图函数填充,该函数将在引发HTTP异常时使用。什么时候?None
为该值传递时,将不会注册HTTP异常的异常视图。经过None
返回将HTTP异常引发到Pyramid1.0异常的行为(异常将传播到 middleware 以及到wsgi服务器)。
http_cache
¶
一种新的价值 http_cache
可以用作 view configuration 参数。
当你提供一个 http_cache
视图配置的值, Expires
和 Cache-Control
由关联视图可调用生成的响应的头将被修改。价值 http_cache
可能是下列之一:
非零整数。如果它是一个非零整数,它被视为秒数。此秒数将用于计算
Expires
报头和Cache-Control: max-age
调用此视图的请求的响应参数。例如:http_cache=3600
指示请求浏览器“将此响应缓存一小时”。A
datetime.timedelta
实例。如果是datetime.timedelta
例如,它将被转换为秒数,该秒数将用于计算Expires
报头和Cache-Control: max-age
调用此视图的请求的响应参数。例如:http_cache=datetime.timedelta(days=1)
指示请求浏览器“将此响应缓存一天”。零 (
0
)如果值为零,则Cache-Control
和Expires
来自此视图的所有响应中存在的头将被组成,这样客户端浏览器缓存(以及任何中间缓存)将被指示从不缓存响应。一个二元组。如果是两元组(例如
http_cache=(1, {{'public':True}})
,元组中的第一个值可以是非零整数或datetime.timedelta
实例;无论哪种情况,此值都将用作缓存响应的秒数。元组中的第二个值必须是字典。字典中的值将用作Cache-Control
响应头。例如:http_cache=(3600, {{'public':True}})
表示“缓存一小时,然后添加”public
到响应“”的缓存控制头。支持的所有键和值webob.cachecontrol.CacheControl
接口可以添加到字典中。供应{{'public':True}}
等于调用response.cache_control.public = True
.
提供非元组值作为 http_cache
等于调用 response.cache_expires(value)
在你的视野内。
提供两元组值作为 http_cache
等于调用 response.cache_expires(value[0], **value[1])
在你的视野内。
如果你想避免影响,那么 Expires
标题,而只希望影响 Cache-Control
头,传递元组为 http_cache
第一个元素是 None
,例如: (None, {{'public':True}})
.
环境设置 PYRAMID_PREVENT_HTTP_CACHE
和配置文件值 prevent_http_cache
是同义词,允许您阻止由Pyramid设置HTTP缓存头 http_cache
一个过程中的全球机械。看见 影响HTTP缓存 和 阻止HTTP缓存 .
更容易编写脚本¶
一个新的API函数 pyramid.paster.bootstrap()
已添加以使编写需要在Pyramid环境下工作的脚本更容易,例如:
from pyramid.paster import bootstrap
info = bootstrap('/path/to/my/development.ini')
request = info['request']
print request.route_url('myroute')
见 写剧本 了解更多详细信息。
次要功能添加¶
现在可以调用
paster pshell
即使其参数中指向的粘贴ini文件节名实际上不是PyramidWSGi应用程序。shell将在降级模式下工作,并警告用户。请参见“创建Pyramid项目”叙述文档部分中的“交互式Shell”。这个
paster pshell
,paster pviews
和paster proutes
命令现在在引擎盖下使用pyramid.paster.bootstrap()
从而可以提供.ini
不命名文件中指向实际Pyramid应用程序的“右”部分的文件。相反,你通常可以只跑paster {{pshell|proutes|pviews}} development.ini
它将做最正确的事情。现在可以添加
[pshell]
应用程序的.ini配置文件的部分,它影响pshell会话可用的全局名称。见 延伸Shell .这个
pyramid.config.Configurator.scan()
方法已成长为**kw
参数。kw
参数表示要传递给金星人的一组关键字参数Scanner
由Pyramid创建的对象。(见 Venusian 有关更多信息的文档Scanner
)新请求属性:
json_body
. 此属性将返回请求体的JSON解码变量。如果请求主体不是格式良好的JSON,则此属性将引发异常。新身份验证策略:
pyramid.authentication.SessionAuthenticationPolicy
,它使用会话来存储凭据。一个名为
pyramid.httpexceptions.exception_response()
是一个快捷方式,可用于使用HTTP整数状态代码创建HTTP异常响应对象。整数和长整型传递为
elements
到pyramid.url.resource_url()
或pyramid.request.Request.resource_url()
例如resource_url(context, request, 1, 2)
(1
和2
是elements
)现在将隐式转换为结果中的字符串。以前作为元素传递整数或长整型会导致类型错误。pyramid_alchemy
脚手架现在使用query.get
而不是query.filter_by
更好地利用身份映射缓存。pyramid_alchemy
脚手架现在有单元测试。增加了一个
pyramid.i18n.make_localizer()
应用程序编程接口。由引发的异常
pyramid.events.NewRequest
事件订阅服务器现在可以被异常视图捕获。现在可以从异常视图中获取有关为何Pyramid引发禁止异常的信息。这个
ACLDenied
返回的对象permits
每种股票授权政策的方法 (pyramid.interfaces.IAuthorizationPolicy.permits()
)现在作为它的result
属性。因此,如果您创建了一个禁止的异常视图,那么您可以看到请求中涉及的ace、acl、权限和主体,例如。context.result.permission
,context.result.acl
等等,在禁止异常视图的逻辑中。不要明确阻止
timeout
从低于reissue_time
当设置pyramid.authentication.AuthTktAuthenticationPolicy
(以前这样的配置会导致ValueError
现在是允许的,尽管通常是胡说八道的)。允许无意义的配置使得代码更易于理解,并且需要更少的测试。这个
pyramid.request.Request
类现在有一个ResponseClass
指向的属性pyramid.response.Response
.这个
pyramid.response.Response
类现在有一个RequestClass
指向的接口pyramid.request.Request
.现在可以从可调用的Pyramid视图返回任意对象,即使不使用渲染器,只要合适的适配器
pyramid.interfaces.IResponse
通过使用pyramid.config.Configurator.add_response_adapter()
应用程序编程接口。请参见文档标题为 更改金字塔处理视图响应的方式 .默认情况下,Pyramid路由器现在将调用
__call__
返回wsgi响应时的响应对象方法。这意味着,除其他外,conditional_response
从WebOB继承的功能响应对象现在将正常工作。名为的新方法
pyramid.request.Request.is_response()
. 应使用此方法而不是pyramid.view.is_response()
函数,已弃用。pyramid.exceptions.NotFound
现在只是pyramid.httpexceptions.HTTPNotFound
.pyramid.exceptions.Forbidden
现在只是pyramid.httpexceptions.HTTPForbidden
.补充
mako.preprocessor
config file参数;允许将mako预处理器指定为python可调用或python点式名称。基本原理见https://github.com/pylons/pyramid/pull/183。新API类:
pyramid.static.static_view
. 这将取代(现在已弃用)pyramid.view.static
类。pyramid.static.static_view
默认情况下,作为请求的结果提供文档path_info
,属性而不是subpath
属性(与之相反的是pyramid.view.static
,仍然是)。pyramid.static.static_view
暴露一个use_subpath
当您希望静态视图的行为类似于旧的已弃用版本时使用的标志。一个新的API函数
pyramid.scripting.prepare()
已添加。这是一个较低水平的模拟pyramid.paster.bootstrap()
它接受一个请求和一个注册表而不是一个配置文件参数,并用于相同的目的:from pyramid.scripting import prepare info = prepare(registry=myregistry) request = info['request'] print request.route_url('myroute')
一个新的API函数
pyramid.scripting.make_request()
已添加。结果请求将具有registry
属性。它是用来与pyramid.scripting.prepare()
和/或pyramid.paster.bootstrap()
(两者都接受请求作为论据):from pyramid.scripting import make_request request = make_request('/')
新建API属性
pyramid.config.global_registries
是一个iterable对象,它包含对加载到当前进程的每个Pyramid注册表的引用,方法是pyramid.config.Configurator.make_wsgi_app()
. 它还有一个last
包含上次加载的注册表的属性。这是由脚本机制使用的,并且可用于自省。增加了
pyramid.renderers.null_renderer
对象作为API。空呈现器是一个对象,可以在高级集成案例中用作视图配置的输入。renderer=
参数。当将空呈现器用作视图呈现器参数时,Pyramid避免将视图可调用结果转换为响应对象。如果您想在Pyramid路由器使用的上下文之外重用视图配置和查找机器,这是很有用的。(此功能由pyramid_rpc
包,它使用视图配置和在路由器上下文之外的查找,完全是这样的。)
向后不兼容¶
Pyramid不再支持python 2.4。运行Pyramid1.1+需要python 2.5或更高版本。然而,Pyramid还不能在任何版本的python 3下工作。
默认情况下,Pyramid路由器现在期望从视图可调用文件返回的响应对象实现
pyramid.interfaces.IResponse
接口。与此接口的Pyramid1.0版本不同,现在实现IResponse的对象必须定义__call__
接受的方法environ
和start_response
,返回app_iter
除其他外,它是无可辩驳的。以前,可以返回任何具有三个WebOB的对象app_iter
,headerlist
和status
属性作为响应,所以这是向后不兼容。通过将适配器注册为从现在从视图可调用文件返回的对象类型响应,可以恢复向后兼容性。请参见文档标题为 更改金字塔处理视图响应的方式 .这个
pyramid.interfaces.IResponse
现在界面更广泛了。以前它只定义app_iter
,status
和headerlist
;现在它基本上是为了直接反映webob.Response
API,它有许多方法和属性。这个
pyramid.httpexceptions
类命名HTTPFound
,HTTPMultipleChoices
,HTTPMovedPermanently
,HTTPSeeOther
,HTTPUseProxy
和HTTPTemporaryRedirect
现在接受location
作为他们的第一个位置论点而不是detail
. 这意味着你可以做到,例如return pyramid.httpexceptions.HTTPFound('http://foo')
而不是return pyramid.httpexceptions.HTTPFound(location='http//foo')
(后者当然会继续工作)。Pyramid路由器试图在密钥中设置一个值
environ['repoze.bfg.message']
当它捕获到与视图相关的异常时,与为其编写的应用程序向后兼容repoze.bfg
在错误处理期间。它是通过使用类似这样的代码来实现的:# "why" is an exception object try: msg = why[0] except: msg = '' environ['repoze.bfg.message'] = msg
价值的使用
environ['repoze.bfg.message']
Pyramid1.0中的文档被弃用。我们的长期政策是在两个主要版本被否决后不删除功能,所以这个代码最初计划在Pyramid1.2中删除。然而,计算repoze.bfg.message
值是至少一个在野外发现的bug的来源(https://github.com/pylons/pyramid/issues/199),并且没有一种既保持向后兼容性又修复bug的简单方法。因此,设置该值的代码在此版本中已被删除。依赖此值在环境中的存在的异常视图中的代码现在应该使用exception
请求的属性(例如request.exception[0]
)检索消息而不是依赖request.environ['repoze.bfg.message']
.
折旧和行为差异¶
备注
在python 2.7+下,必须向python解释器传递正确的警告标志,以便在从旧版本的pyramid移植应用程序时看到pyramid发出的拒绝警告。使用 PYTHONWARNINGS
带值的环境变量 all
在您用来调用的shell中 paster serve
要查看这些警告,例如在UNIX上, PYTHONWARNINGS=all $VENV/bin/paster serve development.ini
. 默认情况下,python 2.5和2.6会显示取消预测警告,因此这里不需要这样做。所有拒绝警告都会发送到控制台。
这个
pyramid.view.static
类已被弃用,取而代之的是较新的pyramid.static.static_view
类。使用时会发出弃用警告。您应该用引用替换它pyramid.static.static_view
与use_subpath=True
参数。这个
paster pshell
,paster proutes
和paster pviews
命令现在采用表单中的单个参数/path/to/config.ini#sectionname
而不是前两个参数的拼写/path/to/config.ini sectionname
.#sectionname
可省略,在这种情况下#main
假设。默认的Mako渲染器现在配置为转义表达式标记中的所有HTML。这有助于防止由于呈现用户未初始化的输入而导致的XSS攻击。要在用户模板中还原此行为,他们需要通过“n”筛选器筛选表达式::
${ myhtml | n }.
参见https://github.com/pylons/pyramid/issues/193。
已弃用对的所有分配
request.response_*
属性(例如request.response_content_type = 'foo'
现已弃用)。响应影响框架所考虑的可分配请求属性的分配和突变现在已被否决:response_content_type
,response_headerlist
,response_status
,response_charset
和response_cache_for
. 用户应该使用通过访问创建的响应对象的适当API,而不是将它们分配给请求对象,以便稍后由呈现机制进行检测。request.response
(例如代码request.response_content_type = 'abc'
应改为request.response.content_type = 'abc'
)将视图相关参数传递给
pyramid.config.Configurator.add_route()
现已弃用。以前,允许使用一组view*
传递给的参数add_route
配置器的方法。这是一个速记,取代了对add_view
. 例如,它是有效的(并且经常被推荐)::config.add_route('home', '/', view='mypackage.views.myview', view_renderer='some/renderer.pt')
经过
view*
论据add_route
现在已弃用,赞成通过将视图连接到预定义路由pyramid.config.Configurator.add_view()
使用路线的route_name
参数。因此,上述示例现在应拼写为:config.add_route('home', '/') config.add_view('mypackage.views.myview', route_name='home', renderer='some/renderer.pt')
这样做是为了减少在IRC中观察到的混乱,以及(最终)减少文档负担。当任何与视图相关的参数传递给
add_route
.参见
也见 issue #164 on GitHub .
路过
environ
字典到__call__
“遍历器”的方法(例如,实现pyramid.interfaces.ITraverser
例如pyramid.traversal.ResourceTreeTraverser
)request
参数现在导致发出一个拒绝警告。消费者代码应通过request
对象。允许传递environ dict这一事实自年以来一直被文档弃用。repoze.bfg
1.1,此功能将在未来版本中完全删除。以下(未记录的,类似字典的)方法
pyramid.request.Request
对象已被弃用:__contains__
,__delitem__
,__getitem__
,__iter__
,__setitem__
,get
,has_key
,items
,iteritems
,itervalues
,keys
,pop
,popitem
,setdefault
,update
和values
. 使用这些方法中的任何一种都将导致发出弃用警告。这些方法是为了在repoze.bfg
1.1(当前预期请求对象的代码预期BFG 1.0及之前版本中的environ对象)。在未来的版本中,这些方法将被完全删除。现在需要自定义请求工厂返回具有
response
属性(或“reified”/“lazy”属性),如果请求要在使用渲染器的视图中使用。这个response
属性应为类的实例pyramid.response.Response
.JSON和字符串呈现器工厂现在分配给
request.response.content_type
而不是request.response_content_type
.现在,每个内置呈现器工厂通过比较响应的内容类型与响应的默认内容类型来确定是否应更改响应的内容类型;如果内容类型是默认内容类型(通常
text/html
,渲染器将内容类型(更改为application/json
或text/plain
分别用于JSON和字符串渲染器)。这个
pyramid.wsgi.wsgiapp2()
现在使用稍微不同的方法来计算如何“修复”SCRIPT_NAME
和PATH_INFO
对于下游应用程序。因此,这些值可能与下游应用程序的角度略有不同(例如,SCRIPT_NAME
将永远不会有一个斜杠)。以前,
pyramid.request.Request
继承自webob.request.Request
并实施__getattr__
,__setattr__
和__delattr__
为了覆盖“adhoc attr”webob行为,请求的属性存储在环境中。现在,pyramid.request.Request
继承自(最近的)webob.request.BaseRequest
而不是webob.request.Request
提供相同的行为。pyramid.request.Request
不再实现自己的__getattr__
,__setattr__
或__delattr__
因此。已弃用
pyramid.view.is_response()
有利于(新增)的功能pyramid.request.Request.is_response()
方法。确定一个对象是否真的是一个有效的响应对象,现在需要访问注册表,注册表只作为请求属性很容易获得。这个pyramid.view.is_response()
函数在被删除之前仍然有效,但现在在某些(非常罕见)情况下可能返回错误的答案。pyramid.response.Response
现在是 子类 属于webob.response.Response
(为了直接执行pyramid.interfaces.IResponse
接口,以加快响应生成)。“异常响应”对象可从导入
pyramid.httpexceptions
(例如)HTTPNotFound
)不再只是为实际生活在webob.exc
. 相反,我们在模块中定义了自己的异常类,该类镜像并模拟webob.exc
异常响应对象几乎完全是。见 Pyramid使用自己的HTTP异常类层次结构,而不是 webob.exc 更多信息请参见设计防御章节。当访问一个表示静态视图的URL,该静态视图解析为一个子目录时,
index.html
那个子目录的服务不好。相反,重定向到/subdir
将发布。这已经被修复,现在访问的子目录包含index.html
在静态视图中,正确返回index.html。参见
也见 issue #67 on GitHub .
贬低
pyramid.config.Configurator.set_renderer_globals_factory
方法与renderer_globals
配置器构造函数参数。用户应该使用此功能转换代码以使用beforerender事件。见剖面图 使用“渲染前”事件 在Hook章节。在Pyramid1.0中,
pyramid.events.subscriber
当将多个接口对象传递给其构造函数时,指令的行为与文档相反。例如,注册以下侦听器时:@subscriber(IFoo, IBar) def expects_ifoo_events_and_ibar_events(event): print event
事件章节文档声称监听器将注册并监听
IFoo
和IBar
事件。相反,它注册了一个“对象事件”订阅服务器,只有在对象接口所在的位置发出IObjectEvent时才会调用该订阅服务器。IFoo
事件接口是IBar
.该行为现在与文档匹配。如果你依赖1.0的马车行为
subscriber
指令要注册对象事件订阅服务器,现在必须传递一个序列,以指示要为对象事件注册订阅服务器。例如。::@subscriber([IFoo, IBar]) def expects_object_event(object, event): print object, event
1,如果A
pyramid.events.BeforeRender
事件订阅服务器通过__setitem__
或update
具有已存在于渲染器全局字典中的键的事件对象的方法,KeyError
提高了。由于配置器的“添加渲染器全局”功能遭到拒绝,因此无法覆盖已存在的渲染器全局字典中的现有值。现在,事件对象将覆盖Globals字典中已经存在的旧值,当__setitem__
或update
被称为(以及新的setdefault
方法),就像一本普通的旧字典。因此,为了实现与其他第三方订阅服务器的最大互操作性,如果您编写了一个事件订阅服务器,该事件订阅服务器将被用作beforerender订阅服务器,那么您的订阅服务器代码现在需要(使用.get
或__contains__
在设置覆盖值之前,请确保渲染器全局字典中没有值。这个
pyramid.config.Configurator.add_route()
方法允许添加具有相同路由的两个路由,而不需要中间调用pyramid.config.Configurator.commit()
. 如果你现在收到ConfigurationError
在启动时,add_route
相关,您需要a)确保所有路由名称都是唯一的或b)呼叫config.commit()
在使用先前添加的名称添加第二个路由之前,或c)使用在autocommit
模式。
依赖关系更改¶
Pyramid现在取决于 WebOb >=1.0.2因为测试依赖于该版本中的错误修复:“修复对缺少的wsgi环境的处理
SCRIPT_NAME
“。(请注意,实际上,每个人都应该使用1.0.4或更好的版本,因为Webob1.0.2和1.0.3是有效的brownbag版本。)
文档增强功能¶
添加了一个标题为 写剧本 到“命令行Pyramid”一章。
这个 zodb+遍历wiki教程 有点更新。
这个 sqlacalchemy+url调度wiki教程 有点更新。
制造
pyramid.interfaces.IAuthenticationPolicy
和pyramid.interfaces.IAuthorizationPolicy
公共接口,它们现在在pyramid.authentication
和pyramid.authorization
API文档。在中呈现每个公开接口的函数定义
pyramid.interfaces
.将缺少的文档引用添加到
pyramid.config.Configurator.set_view_mapper()
并在“文件”一节中提到 使用视图映射器 .在“环境变量和
.ini
“文件设置”章节,标题为 添加自定义设置 .添加的文档 multidict 作为
pyramid.interfaces.IMultiDict
.在“url-dispatch”叙述章节中添加了一节,内容涉及新的“静态”路由功能,标题为 静态路由 .
为添加了API文档
pyramid.httpexceptions.exception_response()
.补充 HTTP异常 章节到视图叙述章节,包括对
pyramid.httpexceptions.exception_response()
.为添加了API文档
pyramid.authentication.SessionAuthenticationPolicy
.