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

静态路由

  • 这个 add_route 配置器的方法现在接受 static 参数。如果这个论点是 True ,在处理请求时,不会考虑将添加的路由进行匹配。相反,它只对通过 route_urlroute_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 视图配置的值, ExpiresCache-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-ControlExpires 来自此视图的所有响应中存在的头将被组成,这样客户端浏览器缓存(以及任何中间缓存)将被指示从不缓存响应。

  • 一个二元组。如果是两元组(例如 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 pshellpaster pviewspaster 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,则此属性将引发异常。

  • A JSONP 渲染器。见 JSONP渲染器 了解更多详细信息。

  • 新身份验证策略: pyramid.authentication.SessionAuthenticationPolicy ,它使用会话来存储凭据。

  • 一个名为 pyramid.httpexceptions.exception_response() 是一个快捷方式,可用于使用HTTP整数状态代码创建HTTP异常响应对象。

  • 整数和长整型传递为 elementspyramid.url.resource_url()pyramid.request.Request.resource_url() 例如 resource_url(context, request, 1, 2) (12elements )现在将隐式转换为结果中的字符串。以前作为元素传递整数或长整型会导致类型错误。

  • 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.permissioncontext.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__ 接受的方法 environstart_response ,返回 app_iter 除其他外,它是无可辩驳的。以前,可以返回任何具有三个WebOB的对象 app_iterheaderliststatus 属性作为响应,所以这是向后不兼容。通过将适配器注册为从现在从视图可调用文件返回的对象类型响应,可以恢复向后兼容性。请参见文档标题为 更改金字塔处理视图响应的方式 .

  • 这个 pyramid.interfaces.IResponse 现在界面更广泛了。以前它只定义 app_iterstatusheaderlist ;现在它基本上是为了直接反映 webob.Response API,它有许多方法和属性。

  • 这个 pyramid.httpexceptions 类命名 HTTPFoundHTTPMultipleChoicesHTTPMovedPermanentlyHTTPSeeOtherHTTPUseProxyHTTPTemporaryRedirect 现在接受 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_viewuse_subpath=True 参数。

  • 这个 paster pshellpaster proutespaster 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_typeresponse_headerlistresponse_statusresponse_charsetresponse_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.ResourceTreeTraverserrequest 参数现在导致发出一个拒绝警告。消费者代码应通过 request 对象。允许传递environ dict这一事实自年以来一直被文档弃用。 repoze.bfg 1.1,此功能将在未来版本中完全删除。

  • 以下(未记录的,类似字典的)方法 pyramid.request.Request 对象已被弃用: __contains____delitem____getitem____iter____setitem__gethas_keyitemsiteritemsitervalueskeyspoppopitemsetdefaultupdatevalues . 使用这些方法中的任何一种都将导致发出弃用警告。这些方法是为了在 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/jsontext/plain 分别用于JSON和字符串渲染器)。

  • 这个 pyramid.wsgi.wsgiapp2() 现在使用稍微不同的方法来计算如何“修复” SCRIPT_NAMEPATH_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
    

    事件章节文档声称监听器将注册并监听 IFooIBar 事件。相反,它注册了一个“对象事件”订阅服务器,只有在对象接口所在的位置发出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版本。)

文档增强功能