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.preprocessorconfig 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.ResponseAPI,它有许多方法和属性。这个
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.bfg1.1,此功能将在未来版本中完全删除。以下(未记录的,类似字典的)方法
pyramid.request.Request对象已被弃用:__contains__,__delitem__,__getitem__,__iter__,__setitem__,get,has_key,items,iteritems,itervalues,keys,pop,popitem,setdefault,update和values. 使用这些方法中的任何一种都将导致发出弃用警告。这些方法是为了在repoze.bfg1.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.authorizationAPI文档。在中呈现每个公开接口的函数定义
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.