Pyramid1.5的新功能

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

主要向后不兼容

  • Pyramid不再依赖或配置默认的Mako和变色龙模板系统渲染器。默认情况下不包括这些模板系统意味着Pyramid核心的依赖性更少,可以在未来的平台上运行,而无需立即关注其模板附加组件的兼容性。它还使维护稍微更有效,因为不同的人可以维护他们理解和关心的模板系统附加组件,而不需要提交访问Pyramid核心,它允许用户不想看到他们不使用的任何软件包,当他们安装Pyramid时随车而来。

    这意味着在升级到Pyramid1.5a2+时,使用这些模板系统的项目在其应用程序尝试呈现变色龙或Mako模板时将看到一个类似这样结束的回溯:

    ValueError: No such renderer factory .pt
    

    或:

    ValueError: No such renderer factory .mako
    

    或:

    ValueError: No such renderer factory .mak
    

    对Mako模板的支持已转移到名为 pyramid_mako 和对变色龙模板的支持已转移到名为 pyramid_chameleon . 这些包是对这些模板语言的旧内置支持的嵌入式替换。您所要做的就是安装它们并使它们在您的配置中处于活动状态,以便为注册渲染器工厂 .pt 和/或 .mako (或) .mak )使您的应用程序再次工作。

    要在现有项目中重新添加对变色龙和/或Mako模板渲染器的支持,请执行以下步骤。

    如果您依赖Mako模板:

    • 确定 pyramid_mako 包已安装。一种方法是添加 pyramid_makoinstall_requires 包的一部分 setup.py 文件,然后重新运行 setup.py develop ::

      setup(
          #...
          install_requires=[
              'pyramid_mako',         # new dependency
              'pyramid',
              #...
          ],
      )
      
    • 在应用程序的实例化Pyramid部分中 Configurator (经常) main() 在项目中的函数 __init__.py 文件),告诉Pyramid包含 pyramid_mako 包括:

      config = Configurator(.....)
      config.include('pyramid_mako')
      

    如果您依赖变色龙模板:

    • 确定 pyramid_chameleon 包已安装。一种方法是添加 pyramid_chameleoninstall_requires 包的一部分 setup.py 文件,然后重新运行 setup.py develop ::

      setup(
          #...
          install_requires=[
              'pyramid_chameleon',         # new dependency
              'pyramid',
              #...
          ],
      )
      
    • 在应用程序的实例化Pyramid部分中 Configurator (经常) main() 在项目中的函数 __init__.py 文件),告诉Pyramid包含 pyramid_chameleon 包括:

      config = Configurator(.....)
      config.include('pyramid_chameleon')
      

    请注意,将这些包安装到 老年人 用于前向兼容的Pyramid。即使您不立即升级到Pyramid1.5,在Pyramid1.4安装中执行上述步骤也非常好,不会造成任何差异,并且在您最终升级到Pyramid1.5时,将提供向前兼容性。

    随着Mako和变色龙支架从核心移除,一些单元测试使用 pyramid.renderers.render* 方法可能开始失败。如果您的任何单元测试正在调用 pyramid.renderers.render()pyramid.renderers.render_to_response() 使用Mako或变色龙模板,然后 pyramid.config.Configurator 在单元测试期间生效的实例也应该更新为包括插件,如上图所示。例如::

    class ATest(unittest.TestCase):
        def setUp(self):
            self.config = pyramid.testing.setUp()
            self.config.include('pyramid_mako')
    
        def test_it(self):
            result = pyramid.renderers.render('mypkg:templates/home.mako', {})
    

    或:

    class ATest(unittest.TestCase):
        def setUp(self):
            self.config = pyramid.testing.setUp()
            self.config.include('pyramid_chameleon')
    
        def test_it(self):
            result = pyramid.renderers.render('mypkg:templates/home.pt', {})
    
  • 如果使用Pyramid调试工具栏,当您将Pyramid升级到1.5a2+时,还需要升级 pyramid_debugtoolbar 由于旧的工具栏版本与Pyramid1.5A2+不兼容,因此至少打包到1.0.8版,因为从核心移除了Mako支持。也可以使用这个较新版本的工具栏代码和较旧的Pyramid。

功能添加

Pyramid1.5中的新增功能如下。

  • python 3.4兼容性。

  • 添加 pdistreport 脚本,它打印正在使用的python版本、正在使用的pythonPyramid版本以及当前安装的所有python发行版的版本号和位置。

  • 添加使用 not_ 类。例如:

    from pyramid.config import not_
    
    @view_config(route_name='myroute', request_method=not_('POST'))
    def myview(request): ...
    

    上面的示例将确保在请求方法未发布时调用视图,至少在没有其他视图更具体的情况下调用。

    这个 pyramid.config.not_ 类可用于任何值,该值是在这些上下文中传递的谓词值:

  • 视图查找现在将根据上下文的继承层次结构搜索有效的视图。它首先尝试根据最具体的上下文查找视图,如果谓词失败,它将向上移动继承链,以测试由上下文的超级类型找到的视图。在过去,只检查包含视图的最特定类型,如果找不到匹配的视图,则会引发谓词不匹配。现在谓词不匹配不会隐藏在超级类型上注册的有效视图。下面是一个很好的例子:

    class IResource(Interface):
    
        ...
    
    @view_config(context=IResource)
    def get(context, request):
    
        ...
    
    @view_config(context=IResource, request_method='POST')
    def post(context, request):
    
        ...
    
    @view_config(context=IResource, request_method='DELETE')
    def delete(context, request):
    
        ...
    
    @implementer(IResource)
    class MyResource:
    
        ...
    
    @view_config(context=MyResource, request_method='POST')
    def override_post(context, request):
    
        ...
    

    以前,重写后视图注册会隐藏myresource上下文中的get和delete视图,这会导致在尝试使用get或delete方法时出现谓词不匹配错误。现在找到了视图,没有出现谓词不匹配的情况。参见https://github.com/pylons/pyramid/pull/786和https://github.com/pylons/pyramid/pull/1004和https://github.com/pylons/pyramid/pull/1046

  • scripts/prequest.py (又名 prequest 控制台脚本):添加了提交支持 PUTPATCH 请求。参见https://github.com/pylons/pyramid/pull/1033。添加提交支持 OPTIONSPROPFIND 请求,并允许用户通过 --login 脚本的参数。参见https://github.com/pylons/pyramid/pull/1039。

  • 这个 pyramid.config.Configurator.add_route() 方法现在支持使用外部URL作为模式进行调用。请参阅https://github.com/pylons/pyramid/issues/611和文档部分 外部路由 .

  • pyramid.authorization.ACLAuthorizationPolicy 支架 __acl__ 作为可赎回的这消除了潜在的 AttributeError 那将在 context 当属性未定义时, AttributeError 可以从动态属性中的任何用户定义的代码中引发。建议将动态ACL定义为可调用的,以避免这种歧义。请参阅https://github.com/pylons/pyramid/issues/735。

  • 允许协议相关的URL(例如 //example.com/images )传递给 pyramid.config.Configurator.add_static_view() . 这允许基于当前协议生成外部托管的静态URL。

  • 这个 pyramid.authentication.AuthTktAuthenticationPolicy 类有两个新选项来配置其域使用:

    • parent_domain :如果设置,则在父域上设置身份验证cookie。如果您有多个站点共享同一个域,这很有用。

    • domain :如果提供,则始终为此域设置cookie,跳过所有常规逻辑。

    请参阅https://github.com/pylons/pyramid/pull/1028、https://github.com/pylons/pyramid/pull/1072和https://github.com/pylons/pyramid/pull/1078。

  • 这个 pyramid.authentication.AuthTktPolicy 现在使用时支持IPv6地址 include_ip=True 选择权。这可能与备选方案不兼容 auth_tkt 实现,因为规范没有定义如何正确处理IPv6。请参阅https://github.com/pylons/pyramid/issues/831。

  • 使通过使用变量参数成为可能 pyramid.paster.get_appsettings() . 这也允许生成 initialize_db 脚本 alchemy 为表单中的选项提供支持的脚手架 a=1 b=2 因此,可以在参数化的 .ini 文件,例如 initialize_myapp_db etc/development.ini a=1 b=2 . 参见https://github.com/pylons/pyramid/pull/911

  • 这个 request.session.check_csrf_token() 方法与 check_csrf 视图谓词现在考虑名为 X-CSRF-Token 以及 csrf_token 表单参数,他们一直这样做)。当表单参数不存在时,将尝试使用头。

  • 现在,通过使用新的 route_nameroute_kwroute_remainder_name 论据 resource_url()resource_path() . 见 生成混合URL .

  • 名为的新HTTP异常超类 HTTPSuccessful 加入。你可以用这个类作为 context 捕获所有200系列“异常”的异常视图(例如“raise httpok”)。这也能让你抓到 only 这个 HTTPOk 异常本身;以前这是不可能的,因为许多其他异常(例如 HTTPNoContent )继承自 HTTPOk 但是现在没有了。

  • 现在可以从Pyramid脚手架中的双支撑(未搭建,这些表示替换值)。你可以使用 \{{\{{a\}}\}} 代表“裸” {{{{a}}}} . 见https://github.com/pylons/pyramid/pull/862

  • 添加 localizerlocale_name 属性(已具体化)到 pyramid.request.Request . 请参阅https://github.com/pylons/pyramid/issues/508。请注意 pyramid.i18n.get_localizer()pyramid.i18n.get_locale_name() 函数现在只需根据请求查找这些属性。

  • 这个 pserve 命令现在接受 -v (或) --verbose 标志和A -q (或) --quiet 旗。运行输出 pserve 可以使用这些标志进行控制。 -v 可以多次指定以增加冗长性。 -q 将详细程度设置为 0 无条件地。默认详细级别为 1 .

  • 这个 alchemy 脚手架测试现在提供了更好的覆盖范围。参见https://github.com/pylons/pyramid/pull/1029

  • 用户现在可以将点式python名称提供给 factory 参数配置器方法名为 add_view_predicate()add_route_predicate()add_subscriber_predicate() . 您不必直接传递谓词工厂,而是可以传递引用工厂的点名称。

  • pyramid.path.package_name() 在解析命名空间包的包名时不再引发异常 __file__ 属性。

  • 已添加授权API作为请求的方法: pyramid.request.Request.has_permission() . 它是基于方法的替代方案 pyramid.security.has_permission() API和工作原理完全相同。旧的API现在已被弃用。

  • 属性API属性已添加到请求中,以便更轻松地访问身份验证数据: pyramid.request.Request.authenticated_useridpyramid.request.Request.unauthenticated_useridpyramid.request.Request.effective_principals . 它们分别是 pyramid.security.authenticated_userid()pyramid.security.unauthenticated_userid()pyramid.security.effective_principals() . 它们的操作完全相同,只是它们是请求的属性,而不是接受请求的函数。它们是属性,因此无法分配给它们。旧的基于函数的API现在已被弃用。

  • Pyramid的控制台脚本 (pservepviews 等等)现在可以直接运行,允许在运行时将自定义参数发送到Python解释器。例如::

    python -3 -m pyramid.scripts.pserve development.ini
    
  • 添加了一个特定的子类 pyramid.httpexceptions.HTTPBadRequest 已命名 pyramid.exceptions.BadCSRFToken 现在将针对 check_csrf_token 视图谓词。参见https://github.com/pylons/pyramid/pull/1149

  • 增加了一个新的 SignedCookieSessionFactory 这和 UnencryptedCookieSessionFactoryConfig 但更明确的重点是签署内容。此函数的自定义序列化程序参数应该只关注序列化,而不像其前置任务要求序列化程序也执行签名。请参阅https://github.com/pylons/pyramid/pull/1142。请注意,使用 SignedCookieSessionFactory 与使用生成的cookie不兼容 UnencryptedCookieSessionFactory ,因此,如果切换到现有用户会话数据,它将被销毁。

  • 增加了一个新的 BaseCookieSessionFactory 它充当一个通用的cookie工厂,框架实现者可以使用它来创建自己的会话实现。它提供了一个可重用的API,它strict关注于提供一个类似字典的对象,该对象正确地处理更新、超时和与 ISession 应用程序编程接口。参见https://github.com/pylons/pyramid/pull/1142

  • 我们不再急于澄清 request.exceptionrequest.exc_info 在特温的例外观点中。这使得可以在完成的回调中检查异常信息。请参阅https://github.com/pylons/pyramid/issues/1223。

其他向后不兼容

  • 修改了 current_route_url() 方法。默认情况下,该方法以前返回的URL没有查询字符串,现在它将附加查询字符串,除非它被重写。

  • 这个 route_url()route_path() API不再引用 /%2F 当替换值包含 / . 这是毫无意义的,因为wsgi服务器总是取消斜杠的引号,而且Pyramid从来没有看到引号。

  • 无法再设置 locale_name 请求的属性,也不可能设置 localizer 请求的属性。这些属性现在是“真实化的”属性,分别使用中描述的机器查找区域设置名称和定位器。 国际化与本土化 .

  • 如果你发送一个 X-Vhm-Root 标题的值以任意数量的斜杠结尾,使用时在生成URL之前,将删除尾随斜杠。 resource_url()resource_path() . 以前,虚拟根路径不会去除尾随斜杠,这将影响URL生成。

  • 这个 pyramid.interfaces.IResourceURL 现在,Interface增加了两个新属性: virtual_path_tuplephysical_path_tuple . 这些应该是资源路径的元组形式(物理和虚拟)。

  • 移除 request.response_* 不同的属性(如“request.response-headers”)。自Pyramid1.1以来,这些属性已被弃用,根据弃用政策,这些属性现在已被删除。

  • request.response 当使用 pyramid.renderers.render() 应用程序编程接口。几乎所有渲染器都会改变 request.response 响应对象(例如,JSON渲染器集 request.response.content_typeapplication/json ,但只有当渲染器生成响应时才需要这样做;当作为调用的副作用执行时,这是一个错误。 pyramid.renderers.render() .

  • 移除 bfg2pyramid 固定程序脚本。

  • 这个 pyramid.events.NewResponse 事件现在已发送 之后 执行响应回调。它以前在执行响应回调之前执行过。理由:能够在响应回调完成任务后而不是以前检查响应,这更有用。

  • 已删除名为的类 pyramid.view.static 从Pyramid1.1开始就被弃用了。代替使用 pyramid.static.static_viewuse_subpath=True 参数。

  • 移除 pyramid.view.is_response 自Pyramid1.1以来已弃用的函数。使用 pyramid.request.Request.is_response() 方法。

  • 删除了将以下参数传递给 pyramid.config.Configurator.add_route()viewview_context . view_forview_permissionview_rendererview_attr . 自Pyramid1.1以来,使用这些参数已被弃用。而不是将与视图相关的参数传递给 add_route ,使用单独的呼叫 pyramid.config.Configurator.add_view() 将视图与使用其 route_name 参数。注意,这会影响 pyramid.config.Configurator.add_static_view() 因为它委托给“添加路由”。

  • 删除了影响和查询 pyramid.request.Request 对象,就像它是字典一样。以前有可能使用 __getitem__getitems 以及其他类似dict的方法来访问wsgi环境中的值。自Pyramid1.1以来,这种行为已被弃用。使用方法 request.environ (一本真正的字典)相反。

  • 删除了古老的向后兼容黑客入侵 pyramid.traversal.DefaultRootFactory 它填充了 __dict__ 与bfg 0.9兼容的matchdict值的工厂。

  • 这个 renderer_globals_factory 论据 pyramid.config.Configurator 构造器和coresponding参数 setup_registry() 已删除。这个 set_renderer_globals_factory 方法 Configurator 也被移除。(内部) pyramid.interfaces.IRendererGlobals 接口也被删除。自1.1以来,这些参数、方法和接口已被弃用。使用A BeforeRender 事件订户,如Pyramid叙述文档的“Hook”一章所述,而不是向配置器提供渲染器全局值。

  • 中的键/值 _query 参数 pyramid.request.Request.route_url() 以及 query 参数 pyramid.request.Request.resource_url() (及其变体),用于编码 None 作为字符串 'None' ,将结果查询字符串保留为 a=b&key=None . 在这种情况下,该值现在被删除,留下一个查询字符串 a=b&key= . 参见https://github.com/pylons/pyramid/issues/1119

废弃

  • 返回A ("defname", dict) 来自具有Mako渲染器的视图的元组现在已被弃用。相反,您应该使用渲染器拼写 foo#defname.mak 在视图配置定义中,只返回dict。

  • 这个 pyramid.config.Configurator.set_request_property() 方法现在在使用时发出一个弃用警告。在1.4中,文档已被弃用,但在使用时未发出弃用警告。

  • pyramid.security.has_permission() 现在不推荐使用 pyramid.request.Request.has_permission() .

  • 这个 pyramid.security.authenticated_userid()pyramid.security.unauthenticated_userid()pyramid.security.effective_principals() 函数已被弃用。使用 pyramid.request.Request.authenticated_useridpyramid.request.Request.unauthenticated_useridpyramid.request.Request.effective_principals 相反。

  • 贬低 pyramid.interfaces.ITemplateRenderer 接口。当mako和chameleon模板绑定被拆分为自己的包时,它被定义得不正确,并且不再使用。

  • 这个 pyramid.session.UnencryptedCookieSessionFactoryConfig API已被弃用,并由 pyramid.session.SignedCookieSessionFactory . 注意,当cookies由 UnencryptedCookieSessionFactoryConfig 与旧版本生成的cookie兼容,由签名的CokieSessionFactory生成的cookie不兼容。参见https://github.com/pylons/pyramid/pull/1142

文档增强功能

脚手架增强

  • 所有脚手架都有一个新的HTML+CSS主题。

  • 更新了文档和脚手架,以与新的2.0版本保持一致 Lingua . 这包括删除所有 setup.cfg 来自脚手架和文档环境的文件。

依赖关系更改

  • Pyramid不再依赖 MakoChameleon .

  • Pyramid现在依赖于webob>=1.3(它使用 webob.cookies.CookieProfile 从1.3±)。