Pyramid 改变历史

未发布的

特征

  • 金字塔增加了对Python3.11的支持。

  • 通过以下方式添加了HTTP 418错误代码 pyramid.httpexceptions.HTTPImATeapot 。请参阅https://github.com/Pylons/pyramid/pull/3667

  • 基于Python3.11而不是Python3.8的测试中的覆盖率报告。

漏洞修补

  • 在对STATIC_VIEW请求文件时,删除了对路径中空字节的支持。虽然HTTP规范允许使用空字节,但由于对空字节的处理可能会导致安全漏洞,因此不再支持空字节。

    这修复了由于Python3.11.0到3.11.4中的错误而存在的安全漏洞,从而允许意外泄露 index.html 静态视图路径上的一个目录。

    感谢LAC公司的Masashi Yamane报道了这一问题。

向后不兼容

  • 对STATIC_VIEW的请求不再允许在路径段的任何部分包含空字节。

  • 金字塔不再在上进行测试,也不支持Python3.6

  • 金字塔删除了对I18N模块中的L*getText()方法的支持。从3.8开始,它们就在PythonGetText模块中被弃用,并在Python3.11中被删除。

文件变更

2.0(2021-02-28)

  • 与2.0b1相比没有变化。

2.0b1(2021-02-20)

  • 中断电势参考循环的时间间隔 requestcontext 。请参阅https://github.com/Pylons/pyramid/pull/3649

  • 删除 update_wrapper 从… pyramid.decorator.reify 。请参阅https://github.com/Pylons/pyramid/pull/3657

2.0b0(2020-12-15)

  • 彻底修改教程并更新Cookiecuter以淡化重点 request.user 赞成 request.identity 用于常见用例。请参阅https://github.com/Pylons/pyramid/pull/3629

  • 使用cookiecutters附带的内置夹具改进文档和模式。请参阅https://github.com/Pylons/pyramid/pull/3629

2.0a0(2020-11-29)

特征

  • 添加对Python3.9的支持。请参阅https://github.com/Pylons/pyramid/issues/3622

  • 这个 aslist 方法现在可以在拼合时处理非字符串对象。请参阅https://github.com/Pylons/pyramid/pull/3594

  • 现在可以将多个值传递给 header 路由和视图配置的谓词。看到了吗pyramid拉金字塔/76

  • 添加对Python3.8的支持。看到了吗https://github.com/Pylons/pyramid/pull/3547

  • 添加了新的安全API,以支持对身份验证和授权系统进行大规模检查。有关使用此新系统的信息,请阅读文档“金字塔2.0中的新特性”一章中的“升级身份验证/授权”。

    • pyramid.config.Configurator.set_security_policy.

    • pyramid.interfaces.ISecurityPolicy

    • pyramid.request.Request.identity

    • pyramid.request.Request.is_authenticated

    • pyramid.authentication.SessionAuthenticationHelper

    • pyramid.authorization.ACLHelper

    • is_authenticated=True/False 路由和视图配置的谓词

    看到了吗https://github.com/Pylons/pyramid/pull/3465以及https://github.com/Pylons/pyramid/pull/3598

  • 更改了默认值 serializer 在……上面 pyramid.session.SignedCookieSessionFactory 要使用 pyramid.session.JSONSerializer 而不是 pyramid.session.PickleSerializer 。请阅读文档“金字塔2.0中的新特性”一章中的“升级会话序列化”,了解有关为什么进行此更改的更多信息。请参阅https://github.com/Pylons/pyramid/pull/3413

  • 现在可以控制路由模式与路由前缀组合时是否包含尾随斜杠,使用 config.include(..., route_prefix=...)with config.route_prefix_context(...) . 这可以通过指定一个空模式并设置新参数来完成。 inherit_slash=True . 例如:

    with config.route_prefix_context('/users'):
        config.add_route('users', '', inherit_slash=True)
    

    在这个例子中,得到的模式是 /users . 同样,如果路由前缀是 /users/ 最后的模式是 /users/ . 如果 pattern'/' ,那么最终模式将始终是 /users/ . 此新设置仅在提供给 add_route 是空字符串 ('' )参见https://github.com/pylons/pyramid/pull/3420

  • 不再定义 pyramid.request.Request.json_body 它已经由WebOB提供。这允许现在可以设置属性。参见https://github.com/pylons/pyramid/pull/3447

  • 改善调试信息 pyramid.view.view_config 装饰工。看到了吗https://github.com/Pylons/pyramid/pull/3483

  • 一个新参数, allow_no_origin ,已添加到 pyramid.config.Configurator.set_default_csrf_options 以及 pyramid.csrf.check_csrf_origin . 此选项控制是否拒绝没有 OriginReferer 头-通常是用户将其浏览器配置为不发送 Referer 即使是在同一个域请求中也有隐私原因。默认情况下,拒绝没有已知来源的请求。也可以允许 Origin: null 通过将其添加到 pyramid.csrf_trusted_origins 在设置中列出。看到了吗https://github.com/Pylons/pyramid/pull/3512以及https://github.com/Pylons/pyramid/pull/3518

  • 一个新参数, check_origin ,已添加到 pyramid.config.Configurator.set_default_csrf_options 完全禁用原点检查。看到了吗https://github.com/Pylons/pyramid/pull/3518

  • 补充 pyramid.interfaces.IPredicateInfo 它将传递给谓词工厂的对象定义为它们的第二个参数。看到了吗https://github.com/Pylons/pyramid/pull/3514

  • 通过使用 content_encodings 的参数 pyramid.config.Configurator.add_static_viewpyramid.static.static_view . 看到了吗https://github.com/Pylons/pyramid/pull/3537

  • 固定 DeprecationWarning 通过使用 imp 模块。看到了吗https://github.com/Pylons/pyramid/pull/3553

  • 通过属性创建 config.add_request_method(..., property=True) or request.set_property used to be readonly. They can now be overridden via request.foo = ... 在删除该值之前,它将返回重写的值。这在测试中模拟请求属性时非常有用。看到了吗https://github.com/Pylons/pyramid/pull/3559

  • 完成的回调现在作为 closer 作为 pyramid.scripting.preparepyramid.paster.bootstrap . 看到了吗https://github.com/Pylons/pyramid/pull/3561

  • 补充 pyramid.request.RequestLocalCache 它可用于创建在请求之间共享的简单对象,并可用于存储每个请求的数据。当数据源在请求本身之外时,这很有用。一个具体化的属性通常通过 pyramid.config.Configurator.add_request_methodpyramid.decorator.reify ,当访问请求属性时按需生成数据时,这些功能非常有用。然而,通常情况下,数据是在访问其他系统时生成的,然后我们希望在请求期间缓存数据。看到了吗https://github.com/Pylons/pyramid/pull/3561

  • 暴露的 pyramid.authorization.ALL_PERMISSIONSpyramid.authorization.DENY_ALL 这样,所有与ACL相关的常量现在都可以从 pyramid.authorization 命名空间。看到了吗https://github.com/Pylons/pyramid/pull/3563

  • pserve 现在将详细消息输出到 stderr 而不是 stdout 规避默认情况下存在的缓冲问题 stdout . 看到了吗https://github.com/Pylons/pyramid/pull/3593

废弃

  • 不建议使用身份验证和授权接口以及基于主体的支持。有关等效API的信息和升级说明,请参阅文档“金字塔2.0中的新特性”一章中的“升级身份验证/授权”。由于此更改,以下API已弃用:

    • pyramid.config.Configurator.set_authentication_policy

    • pyramid.config.Configurator.set_authorization_policy

    • pyramid.interfaces.IAuthenticationPolicy

    • pyramid.interfaces.IAuthorizationPolicy

    • pyramid.request.Request.effective_principals

    • pyramid.request.Request.unauthenticated_userid

    • pyramid.authentication.AuthTktAuthenticationPolicy

    • pyramid.authentication.RemoteUserAuthenticationPolicy

    • pyramid.authentication.RepozeWho1AuthenticationPolicy

    • pyramid.authentication.SessionAuthenticationPolicy

    • pyramid.authentication.BasicAuthAuthenticationPolicy

    • pyramid.authorization.ACLAuthorizationPolicy

    • 这个 effective_principals 查看和路由谓词。

    看到了吗https://github.com/Pylons/pyramid/pull/3465

  • 已弃用 pyramid.security.principals_allowed_by_permission . 此方法继续使用不推荐的 pyramid.interfaces.IAuthorizationPolicy 但不能与新的 pyramid.interfaces.ISecurityPolicy . 看到了吗https://github.com/Pylons/pyramid/pull/3465

  • 不推荐使用的几个与ACL相关的方面 pyramid.security . 现在应该从 pyramid.authorization 命名空间。这包括:

    • pyramid.security.Everyone

    • pyramid.security.Authenticated

    • pyramid.security.ALL_PERMISSIONS

    • pyramid.security.DENY_ALL

    • pyramid.security.ACLAllowed

    • pyramid.security.ACLDenied

    看到了吗https://github.com/Pylons/pyramid/pull/3563

  • 已弃用 pyramid.session.PickleSerializer 。请参见https://github.com/pylons/pyramid/issues/2709,和https://github.com/pylons/pyramid/pull/3353,和https://github.com/pylons/pyramid/pull/3413

向后不兼容

  • 取消对Python 2.7、3.4和3.5的支持。请参见https://github.com/Pylons/pyramid/pull/3421,和https://github.com/Pylons/pyramid/pull/3547,和https://github.com/Pylons/pyramid/pull/3634

  • 移除 pyramid.compat 模块。集成商应使用 six 模块或供应商垫片,他们正在使用到自己的代码库前进。https://github.com/Pylons/金字塔/pull/3421

  • pcreate 而内置的脚手架也被拆除,以便使用 cookiecutter 工具与 pyramid-cookiecutter-starter cookiecutter 。在Pyramid1.8中,脚本和脚手架被弃用。参见https://github.com/pylons/pyramid/pull/3406

  • 更改了默认值 hashalgpyramid.authentication.AuthTktCookieHelpersha512 . 看到了吗https://github.com/Pylons/pyramid/pull/3557

  • 远离的 pyramid.interfaces.ITemplateRenderer . 自Pyramid1.5以来,此接口已被弃用,它是类似 pyramid_makopyramid_chameleon 但Pyramid本身没有提供任何功能。参见https://github.com/pylons/pyramid/pull/3409

  • 远离的 pyramid.security.has_permissionpyramid.security.authenticated_useridpyramid.security.unauthenticated_useridpyramid.security.effective_principals . 这些方法在Pyramid1.5中已被弃用,所有方法都具有可作为请求属性使用的等价物。例如, request.authenticated_userid . 参见https://github.com/pylons/pyramid/pull/3410

  • 已删除对向提供媒体范围的支持 accept 两者的谓词 pyramid.config.Configurator.add_viewpyramid.config.Configurator.add_route . 这些选项在Pyramid1.10和Webob 1.8中被弃用,因为它们导致无法控制的匹配不符合RFC。参见https://github.com/pylons/pyramid/pull/3411

  • 远离的 pyramid.session.UnencryptedCookieSessionFactoryConfig . 此会话工厂已替换为 pyramid.session.SignedCookieSessionFactory 在Pyramid1.5中,从那时起就被弃用了。参见https://github.com/pylons/pyramid/pull/3412

  • 远离的 pyramid.session.signed_serializepyramid.session.signed_deserialize . 这些方法只在现在被删除的 pyramid.session.UnencryptedCookieSessionFactoryConfig 并且与易受攻击的pickle序列化格式耦合,如果密钥受到破坏,则可能导致删除代码执行。参见https://github.com/pylons/pyramid/pull/3412

  • 更改了默认值 serializer 在……上面 pyramid.session.SignedCookieSessionFactory 要使用 pyramid.session.JSONSerializer 而不是 pyramid.session.PickleSerializer 。请阅读文档“金字塔2.0中的新特性”一章中的“升级会话序列化”,了解有关为什么进行此更改的更多信息。请参阅https://github.com/Pylons/pyramid/pull/3413

  • pyramid.request.Request.invoke_exception_view 将不再由默认执行策略调用。看到了吗https://github.com/Pylons/pyramid/pull/3496

  • pyramid.config.Configurator.scan 默认情况下,将不再执行为以下类别注册的金星装饰器回调 'pyramid' . 要查找任何不考虑类别的装饰器,请指定 config.scan(..., categories=None) . 看到了吗https://github.com/Pylons/pyramid/pull/3510

  • 谓词工厂的第二个参数已从 configinfo ,的实例 pyramid.interfaces.IPredicateInfo . 这限制了谓词可用的数据,但仍然提供了包、注册表、设置和点式名称解析程序,它们应该涵盖大多数用例,并且在很大程度上是向后兼容的。看到了吗https://github.com/Pylons/pyramid/pull/3514

  • 移除 check_csrf 谓语。相反,使用 pyramid.config.Configurator.set_default_csrf_options 以及 require_csrf 视图选项以启用自动CSRF检查。看到了吗https://github.com/Pylons/pyramid/pull/3521

  • 更新的默认行为 pyramid.authenticationAuthTktAuthenticationPolicypyramid.authentication.AuthTktCookieHelper 在没有指定其他域约束的情况下,只设置一个没有域参数的cookie。在此之前, wild_domain=False (违约)实际上与 wild_domain=True ,其中定义了一个cookie,以便浏览器将它用于请求的域以及任何子域。在新行为中,默认情况下,cookies只影响当前域,而不影响子域。看到了吗https://github.com/Pylons/pyramid/pull/3587

文件变更

  • 在阅读文档时恢复PDF的构建。参见https://github.com/pylons/pyramid/issues/3290

  • 修复Sphinx2.0的文档构建。看到了吗https://github.com/Pylons/pyramid/pull/3480

  • 对wiki和wiki2教程进行了重要的更新,以演示新的安全策略的用法,以及更适合生产的测试工具。看到了吗https://github.com/Pylons/pyramid/pull/3557

1.10(2018年10月31日)

  • 1.10b1无重大变化。

1.10b1(2018年10月28日)

漏洞修补

  • 修复 pyramid.testing.DummyRequest 支持新的 request.accept API使 acceptable_offers 即使在代码将值设置为字符串时也可用。参见https://github.com/pylons/pyramid/pull/3396

  • 修复不推荐使用的转义序列,为python 3.8做准备。参见https://github.com/pylons/pyramid/pull/3400

1.10A1(2018年10月15日)

特征

  • 添加 _depth_category 所有金星装饰师的参数。这个 _category 参数可用于影响在执行 config.scan(..., category=...) 具有特定类别。这个 _depth 当用自己的方法包装装饰器时,应该使用参数。这一变化影响 pyramid.view.view_configpyramid.view.exception_view_configpyramid.view.forbidden_view_configpyramid.view.notfound_view_configpyramid.events.subscriberpyramid.response.response_adapter 装饰工。请参阅https://github.com/pylons/pyramid/pull/3105和https://github.com/pylons/pyramid/pull/3122

  • 修复 pyramid.request.Request 使用后的类名 set_propertyconfig.add_request_method 这样 str(request.__class__) 将表现为 pyramid.request.Request 而不是 pyramid.util.Request . 参见https://github.com/pylons/pyramid/pull/3129

  • cherrypy_server_runner 更喜欢从 cheroot 打包旧版导入源 cherrypy.wsgiserver . 参见https://github.com/pylons/pyramid/pull/3235

  • 添加上下文管理器 route_prefix_contextpyramid.config.Configurator 为了方便设置 includeadd_route 在上下文中调用。参见https://github.com/pylons/pyramid/pull/3279

  • 修改内置会话实现以支持 SameSite cookie上的选项并将默认值设置为 'Lax' . 这种影响 pyramid.session.BaseCookieSessionFactorypyramid.session.SignedCookieSessionFactorypyramid.session.UnencryptedCookieSessionFactoryConfig . 参见https://github.com/pylons/pyramid/pull/3300

  • 修改 pyramid.authentication.AuthTktAuthenticationPolicypyramid.csrf.CookieCSRFStoragePolicy 支持 SameSite cookies上的选项,并将默认值设置为 'Lax' . 参见https://github.com/pylons/pyramid/pull/3319

  • 新增 pyramid.httpexceptions.HTTPPermanentRedirect HTTP 308重定向的异常/响应对象。参见https://github.com/pylons/pyramid/pull/3302

  • pshell ,允许用户定义 setup 函数是一个生成器,在这种情况下,它可以包装命令的生命周期。参见https://github.com/pylons/pyramid/pull/3318

  • pshell ,变量由 [pshell] 设置在用户定义的 setup 功能。参见https://github.com/pylons/pyramid/pull/3318

  • 添加对python 3.7的支持。在python 3.8上添加允许失败的测试。参见https://github.com/pylons/pyramid/pull/3333

  • 增加了 pyramid.config.Configurator.add_accept_view_order 指令,允许用户在多个视图匹配等不明确情况下指定媒体类型首选项。默认的排序是为更喜欢人类可读的HTML/文本响应而不是JSON的媒体类型定义的。参见https://github.com/pylons/pyramid/pull/3326

  • 支持中的媒体类型列表 accept 中使用的谓词 pyramid.config.Configurator.add_route . 参见https://github.com/pylons/pyramid/pull/3326

  • 补充 pyramid.session.JSONSerializer . 有关此功能的详细信息,请参阅文档“会话”一章中的“Pyramid2.0中即将对Isession进行的更改”。参见https://github.com/pylons/pyramid/pull/3353

  • 添加 registry 参数 pyramid.renderers.get_renderer 允许用户在渲染器查找期间避免线程局部变量。参见https://github.com/pylons/pyramid/pull/3358

  • Pyramid的测试套件不再与通用轮一起分发。参见https://github.com/pylons/pyramid/pull/3387

  • 所有的python代码现在都使用 black . 参见https://github.com/pylons/pyramid/pull/3388

漏洞修补

  • 设置适当 codetitle 上的属性 HTTPClientErrorHTTPServerError 异常类。这可以防止意外返回520错误代码。参见https://github.com/pylons/pyramid/pull/3280

  • 替换 webob.acceptparse.MIMEAccept 来自WebOb webob.acceptparse.create_accept_header 在HTTP异常处理代码中。老年人 MIMEAccept 已弃用。新方法更接近于RFC。参见https://github.com/pylons/pyramid/pull/3251

  • 捕获其他错误,如 AttributeError 当取消选择“可信”会话cookie时,其中包含错误的pickle数据。当在不应该共享会话cookie的项目之间共享秘密时,例如在开发中的项目之间重用秘密时,就会发生这种情况。参见https://github.com/pylons/pyramid/pull/3325

废弃

  • 这个 pyramid.interfaces.ISession 接口将移动到金字塔2.0中需要JSON可序列化对象。有关此更改的详细信息,请参阅文档“会话”一章中的“金字塔2.0中即将对Isession进行的更改”。参见https://github.com/pylons/pyramid/pull/3353

  • 这个 pyramid.session.signed_serializepyramid.session.signed_deserialize 函数将在Pyramid2.0中删除,同时删除 pyramid.session.UnencryptedCookieSessionFactoryConfig 在Pyramid1.5中被弃用。请切换到使用 SignedCookieSessionFactory ,如果仍在使用这些功能,则复制代码或其他会话实现。参见https://github.com/pylons/pyramid/pull/3353

  • 中的媒体范围已弃用 accept 的参数 pyramid.config.Configurator.add_route . 使用显式媒体类型列表 add_route 支持多种类型。

  • 中的媒体范围已弃用 accept 的参数 pyramid.config.Configurator.add_view . 范围到没有替换 add_view 但经过多次讨论,工作流在面对各种客户端提供的 Accept 标题。参见https://github.com/pylons/pyramid/pull/3326

向后不兼容

  • 在python 3.4+ repoze.lru 相关性已删除。如果你直接在你的应用程序中使用这个软件包,你应该确保你在你的项目中直接依赖它。参见https://github.com/pylons/pyramid/pull/3140

  • 移除 permission 论证从 pyramid.config.Configurator.add_route . 这是一个从Pyramid1.5中删除的特征遗留下来的参数,从那时起就没有任何效果。参见https://github.com/pylons/pyramid/pull/3299

  • 将内置会话实现修改为 SameSite='Lax' 饼干。这种影响 pyramid.session.BaseCookieSessionFactorypyramid.session.SignedCookieSessionFactorypyramid.session.UnencryptedCookieSessionFactoryConfig . 参见https://github.com/pylons/pyramid/pull/3300

  • 中定义的变量 [pshell] 设置部分将不再覆盖由 setup 功能。参见https://github.com/pylons/pyramid/pull/3318

  • pyramid.config.Configurator.add_notfound_view 使用默认重定向类异常 pyramid.httpexceptions.HTTPTemporaryRedirect 而不是上一个 pyramid.httpexceptions.HTTPFound . 参见https://github.com/pylons/pyramid/pull/3328

  • 远离的 pyramid.config.Configurator.set_request_property 从Pyramid1.5开始就被弃用了。代替使用 pyramid.config.Configurator.add_request_method 具有 reify=Trueproperty=True . 参见https://github.com/pylons/pyramid/pull/3368

  • 移除 principal 关键字参数来自 pyramid.security.remember 从Pyramid1.6开始就被弃用,取而代之的是 userid 参数。参见https://github.com/pylons/pyramid/pull/3369

  • 移除 pyramid.tests 用于包含Pyramid测试套件的子包。这些更改还更改了存储库的格式,以便将代码移动到 src 文件夹。参见https://github.com/pylons/pyramid/pull/3387

文件变更

  • 广告支持阅读文档道德广告。请参阅https://github.com/pylons/pyramid/pull/3360和https://docs.read the docs.io/en/latest/advertising/ethical-advertising.html

  • 添加对alembic的支持到Pyramid烹饪者炼金术烹饪者,并更新wiki2教程来解释它是如何工作的。参见https://github.com/pylons/pyramid/pull/3307和https://github.com/pylons/pyramid-cookiecutter-alchemy/pull/7

  • 在setup.py中将sphinx凹凸到大于等于1.7.4以支持 emphasize-lines 在PDF中,为Xeletex支持铺平道路。请参阅https://github.com/pylons/pyramid/pull/3271、https://github.com/pylons/pyramid/issues/667和https://github.com/pylons/pyramid/issues/2572。

  • 在快速教程中添加了额外的测试。参见https://github.com/pylons/pyramid/pull/3375

1.9(2017-06-26)

  • 1.9B1无重大变化。

  • 更新的文档链接 docs.pylonsproject.org 使用HTTPS。

1.9B1(2017年6月19日)

  • 在提供未知谓词时添加信息性错误消息。新消息根据已知谓词列表建议了其他选项。见https://github.com/pylons/pyramid/pull/3054

  • 为cookiecutters、scaffolds中的javascripts添加了完整性属性,并在教程中生成了源文件。参见https://github.com/pylons/pyramid/issues/2548

  • 更新releasing.txt以更新cookiecutters。更改cookiecutter URL以使用快捷方式。参见https://github.com/pylons/pyramid/issues/3042

  • 确保在从调用视图执行期间推送正确的线程局部变量 request.invoke_exception_view . 参见https://github.com/pylons/pyramid/pull/3060

  • 修正一个错误 pyramid.security.ALL_PERMISSIONS 未能在其中返回有效的迭代器 __iter__ 实施。参见https://github.com/pylons/pyramid/pull/3074

  • 将权限结果规范化为适当的类层次结构。 pyramid.security.ACLAllowed 现在是的子类 pyramid.security.Allowedpyramid.security.ACLDenied 现在是的子类 pyramid.security.Denied . 参见https://github.com/pylons/pyramid/pull/3084

  • 添加 quote_via 参数 pyramid.encode.urlencode 遵循stdlib的版本并启用自定义引用函数。参见https://github.com/pylons/pyramid/pull/3088

  • 支持 _query=None and _ 锚=没有 ``request.route_url` 以及 query=Noneanchor=None 在里面 request.resource_url . 以前这会导致 ? 和A # ,分别位于URL中,后面没有任何内容。现在,不必要的部分将从生成的URL中删除。参见https://github.com/pylons/pyramid/pull/3034

  • 改造 IRouter API使用 IExecutionPolicy 强制推/弹出请求线程局部变量。这个 IRouter.make_request(environ) API已被替换为 IRouter.request_context(environ) 它应该用作上下文管理器。参见https://github.com/pylons/pyramid/pull/3086

1.9A2(2017年5月9日)

向后不兼容

  • request.exceptionrequest.exc_info 只有在excview tween生成响应时才会设置。这是为了避免在管道中的其他位置生成响应,而不是与原始异常直接相关时出现任何混淆。如果上游的任何人想要捕获并呈现异常的响应,他们应该设置 request.exceptionrequest.exc_info 它们自己指示在生成响应时被压扁的异常。

    类似的行为发生在 request.invoke_exception_view 其中,如果方法成功生成响应,则将异常属性设置为反映异常。

    这是一个非常小的不相容性。现在大多数孩子会优先考虑提出的例外,而忽略 request.exception . 这一变化只是通过试图更清楚地了解响应与其压扁的异常之间的关系来改进和澄清簿记。请参阅https://github.com/pylons/pyramid/pull/3029和https://github.com/pylons/pyramid/pull/3031

1.9A1(2017年5月1日)

主要特征

  • 所有人使用的文件格式 p* 命令行脚本,例如 pservepshell 以及 pyramid.paster.bootstrap 由于对 plaster .

    到目前为止,Pyramid仍在运输中,并集成了对pastedeploy ini格式的支持,具体取决于 plaster_pastedeploy 绑定库。这在将来可能会改变。

    参见https://github.com/pylons/pyramid/pull/2985

  • 向请求管道添加了执行策略Hook。执行策略能够在请求对象进入管道的其余部分之前控制其创建和执行。这意味着对于单个请求环境,策略可以创建多个请求对象。

    使用此功能的第一个库是 pyramid_retry .

    参见https://github.com/pylons/pyramid/pull/2964

  • CSRF支持已从会话中重构为它自己的独立API。 pyramid.csrf 模块。它支持可插拔的 pyramid.interfaces.ICSRFStoragePolicy 它可以用来定义您自己的机制来生成和验证CSRF令牌。默认情况下,Pyramid继续使用 pyramid.csrf.LegacySessionCSRFStoragePolicy 使用 request.session.get_csrf_tokenrequest.session.new_csrf_token API在引擎盖下以保持兼容性。还有两个新的保险单要运来, pyramid.csrf.SessionCSRFStoragePolicypyramid.csrf.CookieCSRFStoragePolicy 它将分别在会话和独立cookie中存储CSRF令牌。可以使用新的 pyramid.config.Configurator.set_csrf_storage_policy 配置指令。

    应通过新的 pyramid.csrf.get_csrf_tokenpyramid.csrf.new_csrf_tokenpyramid.csrf.check_csrf_token API以便在存储策略更改时继续工作。此外, pyramid.csrf.get_csrf_token 函数被注入到模板中,以便在UI代码中使用。

    请参阅https://github.com/pylons/pyramid/pull/2854和https://github.com/pylons/pyramid/pull/3019

次要特征

  • 支持一个 open_url 中的配置设置 pserve 配置文件的节。此URL用于在以下情况下打开Web浏览器: pserve --browser 被调用。当此设置不可用时, pserve 脚本将尝试从 server:<server_name> 配置文件的一部分,但不要求以这种格式运行服务器,因此它可能会失败。参见https://github.com/pylons/pyramid/pull/2984

  • 这个 pyramid.config.Configurator 现在可以用作上下文管理器,它将自动推送/弹出线程局部变量(类似于 config.begin()config.end() )它还将自动执行 config.commit() 因此,建议只在应用程序的顶层使用。参见https://github.com/pylons/pyramid/pull/2874

  • 线程局部变量现在可在通过调用的任何函数中使用。 config.include . 这意味着唯一不能依赖线程局部变量的配置时代码是从主系统内部的非操作执行的代码。这可以通过调用 config.begin()config.end() 或者使用配置器的新上下文管理器特性。参见https://github.com/pylons/pyramid/pull/2989

漏洞修补

  • httpException接受一个细节Kwarg,该细节可用于向异常传递附加细节。只要对象具有有效的 __str__ 方法。参见https://github.com/pylons/pyramid/pull/2951

  • 修复导致内存泄漏的引用循环,在该循环中注册表将保留 Configurator 即使在配置程序被丢弃之后,实例仍处于活动状态。还为 global_registries 对象,在该对象中,注册表存储在一个闭包中,以防止释放它。参见https://github.com/pylons/pyramid/pull/2967

  • 修复直接调用的错误 pyramid.scripts.pserve.main--reload 其中的选项 sys.argv 总是在子流程中使用,而不是在提供的 argv . 参见https://github.com/pylons/pyramid/pull/2962

废弃

  • Pyramid目前依赖于 plaster_pastedeploy 简化到 plaster 通过维护对ini文件的集成支持。这种依赖 plaster_pastedeploy 应被视为服从Pyramid的贬低政策,并可能在未来被移除。应用应取决于适当的石膏结合,以满足他们的需要。

  • 从会话中检索CSRF令牌已被弃用,取而代之的是 pyramid.csrf 模块。CSRF方法 (ISession.get_csrf_tokenISession.new_csrf_token )不再需要 ISession 接口,使用默认值时除外 pyramid.csrf.LegacySessionCSRFStoragePolicy .

    也, pyramid.session.check_csrf_token 现在位于 pyramid.csrf.check_csrf_token .

    请参阅https://github.com/pylons/pyramid/pull/2854和https://github.com/pylons/pyramid/pull/3019

文件变更

  • 在“请求处理”一章的路由图中添加了执行策略。参见https://github.com/pylons/pyramid/pull/2993

1.8(2017-01-21)

  • 1.8b1无重大变化。

1.8b1(2017-01-17)

特征

  • 增加了一个 override 选择权 config.add_translation_dirs 允许以后调用将翻译目录置于比以前调用更高的优先级。参见https://github.com/pylons/pyramid/pull/2902

文件变更

  • 改进注册表文档,讨论用作组件注册表和字典。参见https://github.com/pylons/pyramid/pull/2893

  • 快速浏览、快速教程和大多数其他剩余的文档都更新为使用CookieCutters而不是PCreate和scaffolds。请参阅https://github.com/pylons/pyramid/pull/2888和https://github.com/pylons/pyramid/pull/2889

  • 修复wiki2中的UnitTests,使其在Py2和Py3之间没有不同的依赖关系的情况下工作。参见https://github.com/pylons/pyramid/pull/2899

  • 更新Windows文档以跟踪对安装程序的更新的python 3改进。参见https://github.com/pylons/pyramid/pull/2900

  • 更新了 mod_wsgi 使用CookiCutters和Apache2.4+的教程。参见https://github.com/pylons/pyramid/pull/2901

1.8A1(2016年12月25日)

向后不兼容

  • 支持 IContextURL 已删除Pyramid1.3中不推荐使用的接口。参见https://github.com/pylons/pyramid/pull/2822

  • 在Pyramid降级期间(1.6->1.8)之后,已删除对pserver的守护进程支持。这包括删除守护进程命令(start、stop、restart、status)以及以下参数: --daemon--pid-file--log-file--monitor-restart--status--user--group--stop-daemon

    要将服务器作为守护进程运行,应使用进程管理器而不是pserver。

    参见https://github.com/pylons/pyramid/pull/2615

  • pcreate 现在默认为交互式。如果已存在具有不同内容的文件,系统将提示您。以前,如果有类似的文件,除非您指定,否则将自动跳过它们。 --interactive--overwrite . 参见https://github.com/pylons/pyramid/pull/2775

  • 删除了未记录的参数 cachebust_matchpyramid.static.static_view . 这一论点是在Pyramid1.6中偶然提出的。参见https://github.com/pylons/pyramid/pull/2681

  • 更改静态视图以避免设置 Content-Encoding 使用python猜测的编码的响应头 mimetypes 模块。这导致客户端在下载gzip文件时对其内容进行解码。客户最终会得到 foo.txt.gz 磁盘上已解码的文件,因此 foo.txt . 此外, Content-Encoding 仅当客户端本身广播支持通过 Accept-Encoding 请求头。参见https://github.com/pylons/pyramid/pull/2810

  • 设置不再作为设置对象(例如 request.registry.settings.foo )这在Pyramid1.2中被否决。参见https://github.com/pylons/pyramid/pull/2823

特征

  • python 3.6兼容性。https://github.com/pylons/pyramid/issues/2835

  • pcreate 了解到 --package-name 允许您在现有文件夹中使用与项目名称不同的包名称创建新项目。参见https://github.com/pylons/pyramid/pull/2783

  • 这个 _get_credentials 私有方法 BasicAuthAuthenticationPolicy 已提取为独立函数 extract_http_basic_credentials 在里面 pyramid.authentication 模块,此函数从 request 对象,并将其作为命名元组返回。参见https://github.com/pylons/pyramid/pull/2662

  • Pyramid1.4悄悄地删除了已恢复的配置程序的一个功能。行动鉴别器也有可能在不同的行动指令之间发生冲突。参见https://github.com/pylons/pyramid/pull/2757

  • pyramid.paster.bootstrap 和它的同胞 pyramid.scripting.prepare 现在可以用作上下文管理器来自动调用 closer 将线程局部变量从堆栈中弹出以防止内存泄漏。参见https://github.com/pylons/pyramid/pull/2760

  • 补充 pyramid.config.Configurator.add_exception_view 以及 pyramid.view.exception_view_config 装饰者。现在可以使用这些方法或通过新的 exception_only=True 选择权 add_view 添加只在处理异常时匹配的视图。以前,还为从异常类继承的遍历上下文注册了任何异常视图,这阻止了任何仅限异常的优化。参见https://github.com/pylons/pyramid/pull/2660

  • 增加了 exception_only 布尔到 pyramid.interfaces.IViewDeriverInfo 视图派生器可以使用它来确定是否包装只处理异常的视图。这意味着不再需要对 request.exception 要确定视图是否正在处理异常,可以在配置时优化管道。参见https://github.com/pylons/pyramid/pull/2660

  • pserve 现在应该和 gevent 以及其他需要MonkeyPatch进程的工作人员,假设服务器和/或应用程序在导入Pyramid的其余部分之前尽可能快地这样做。参见https://github.com/pylons/pyramid/pull/2797

  • Pyramid不再复制传递给 pyramid.config.Configurator(settings=) . 原文 dict 保持不变。参见https://github.com/pylons/pyramid/pull/2823

  • CSRF Trusted Origins设置现在可能是一个空格分隔的域列表。以前只允许使用python列表。此外,现在可以使用 PYRAMID_CSRF_TRUSTED_ORIGINS 与其他设置类似的环境变量。参见https://github.com/pylons/pyramid/pull/2823

  • pserve --reload 现在使用 hupper 用于监视文件更改的库。这带来了许多改进:

    • 如果 watchdog 安装包后,将使用inotify而不是CPU和磁盘密集型轮询来完成监视。

    • 监视器现在是一个独立的进程,它不会崩溃并在任何代码之前启动。

    • 在保存文件之前,监视器不会在崩溃后重新启动进程。

    • 显示器在Windows上工作。

    • 现在可以通过以下方式从Pyramid视图或任何其他代码手动触发重新加载: hupper.get_reloader().trigger_reload() . 有点整洁。

    • 您可以通过发出 SIGHUP 到监视器进程。

    参见https://github.com/pylons/pyramid/pull/2805

  • 一个新的 [pserve] 配置文件中支持节 watch_files 可配置的密钥 pserve --reload 监视自定义文件路径。参见https://github.com/pylons/pyramid/pull/2827

  • 允许从的子类进行流式响应 pyramid.httpexceptions.HTTPException . 以前,在测试身体时会展开响应,这使得不可能对响应进行流式处理。参见https://github.com/pylons/pyramid/pull/2863

  • 通过使用新的 listen 服务员的指示。参见https://github.com/pylons/pyramid/pull/2853

  • 所有P*脚本现在都使用argparse而不是optparse。这提高了他们的 --help 输出并使其选项的文档更加清晰。参见https://github.com/pylons/pyramid/pull/2864

  • 通过注册的任何延迟配置操作 config.action 现在可能取决于线程本地状态,如资产覆盖,在执行操作时处于活动状态。参见https://github.com/pylons/pyramid/pull/2873

  • 传递到的目录的资产规格 config.add_translation_dirs 现在支持覆盖整个资产规范,包括文件夹名称。以前只支持包名称,文件夹始终需要具有相同的名称。参见https://github.com/pylons/pyramid/pull/2873

  • config.begin() 只要注册表相同,将通过传播当前线程本地请求。例如:

    request = Request.blank(...)
    config.begin(request)  # pushes a request
    config.begin()         # propagates the previous request through unchanged
    assert get_current_request() is request
    

    参见https://github.com/pylons/pyramid/pull/2873

  • 增加了一个新的 callback 选择权 config.set_default_csrf_options 它可用于确定是否应启用CSRF检查以允许混合身份验证方法。只有基于cookie的方法通常需要CSRF检查。参见https://github.com/pylons/pyramid/pull/2778

漏洞修补

  • 固定错误 proutes 这样,当一个类和 attr 涉及。参见:https://github.com/pylons/pyramid/pull/2687

  • 修复一 FutureWarning 在使用python 3.5时 re.splitformat 设置到 proutes 脚本。参见https://github.com/pylons/pyramid/pull/2714

  • 修复一 RuntimeWarning 当使用任意对象作为 useridAuthTktAuthenticationPolicy . 现在,策略会捕捉到这一点,并将对象序列化为base64字符串,以避免出现隐藏的警告。由于用户ID将在随后的请求中作为字符串进行读取,因此会发出一个更有用的警告,鼓励您改用基元类型。参见https://github.com/pylons/pyramid/pull/2715

  • Pyramid1.6引入了一个动作调用另一个动作的能力。有个错误 config.add_view 将与1.7Pyramid中引入的自定义视图派生器交互,因为在以较早的顺序创建视图派生器和视图谓词之前,无法计算视图的鉴别器。从另一个操作调用操作将触发管道展开,并在准备好之前计算鉴别器。新行为尊重 order 并确保在执行之前订单的依赖操作之前不会计算鉴别器。参见https://github.com/pylons/pyramid/pull/2757

  • 修复i18n中默认域总是使用日耳曼复数样式的错误,即使在相关消息文件中定义了不同的复数函数。参见https://github.com/pylons/pyramid/pull/2859

  • 这个 config.override_asset 方法现在发生在 pyramid.config.PHASE1_CONFIG 以便在调用 config.add_translation_dirs . 参见https://github.com/pylons/pyramid/pull/2873

废弃

文件变更

  • 更新排版惯例。https://github.com/pylons/pyramid/pull/2838

  • 添加 pyramid_nacl_session 对工厂进行会话。参见https://github.com/pylons/pyramid/issues/2791

  • 更新 HACKING.txt 从从未合并到master的过时分支。参见https://github.com/pylons/pyramid/pull/2782

  • 更新了Windows安装说明和相关位。参见https://github.com/pylons/pyramid/issues/2661

  • 修复视图谓词和路由谓词之间文档中的不一致,并突出它们的API中的差异。参见https://github.com/pylons/pyramid/pull/2764

  • 澄清可能的误用 headers Kwarg到 pyramid.httpexceptions.HTTPException 其中,来自父类的更合适的禁忌 pyramid.response.Response 应该改为使用。参见https://github.com/pylons/pyramid/pull/2750

  • sqlacalchemy+url调度+jinja2 (wiki2 )和zodb+traversal+chameleon (wiki )已经更新了教程,以利用新的cookiecutters并放弃对 pcreate 脚手架。

    请参见https://github.com/pylons/pyramid/pull/2881和https://github.com/pylons/pyramid/pull/2883。

  • 改进P*脚本描述的输出以获取帮助。参见https://github.com/pylons/pyramid/pull/2886

  • 快速巡更更新使用烹饪工具,而不是创建和脚手架。参见https://github.com/pylons/pyramid/pull/2888

1.7(2016-05-19)

  • 修复wiki2教程中bcrypt总是需要字节字符串的错误。参见https://github.com/pylons/pyramid/pull/2576

  • 简化Windows检测代码并删除一些重复数据。请参阅https://github.com/pylons/pyramid/pull/2585和https://github.com/pylons/pyramid/pull/2586

1.7B4(2016-05-12)

  • 修复了在找不到异常视图来处理异常的情况下,使用异常视图tween重新引发原始异常的问题。这更好地允许tweens进一步向上处理未处理的异常。以前它们会被转换成 PredicateMismatch 如果谓词不允许视图处理异常,则为异常。参见https://github.com/pylons/pyramid/pull/2567

  • 暴露了 pyramid.interfaces.IRequestFactory 镜像公众的接口 pyramid.interfaces.IResponseFactory 接口。

1.7B3(2016-05-10)

  • 固定 request.invoke_exception_view 养一个 HTTPNotFound 如果没有匹配的视图,则出现异常。以前 None 如果没有匹配的视图和 PredicateMismatch 如果视图“几乎”匹配(找到与上下文匹配的视图),则将引发。参见https://github.com/pylons/pyramid/pull/2564

  • 将py.test配置和覆盖范围的默认值添加到所有三个脚手架,并相应地更新文档。参见https://github.com/pylons/pyramid/pull/2550

  • 添加 linkcheckMakefile 为了Sphinx。要检查文档中是否有断开的链接,请使用命令 make linkcheck SPHINXBUILD=$VENV/bin/sphinx-build . 还拆除和修复了几十个断裂的外部链接。

  • 固定脚手架测试的内部转轮,确保其与PIP和PY.TEST一起工作。参见https://github.com/pylons/pyramid/pull/2565

1.7B2(2016-05-01)

  • 删除了alchemy scaffold development.ini中的pyramid_tm,见https://github.com/pylons/pyramid/issues/2538。

  • 默认权限集通过 config.set_default_permission 将不再对异常视图强制执行。对于默认的异常视图,这种情况已经存在一段时间了。 (config.add_notfound_viewconfig.add_forbidden_view 但是,对于任何其他异常视图,开发人员必须记住设置 permission=NO_PERMISSION_REQUIRED 或者当事情不起作用时感到惊讶。通过设置 permission 参数手动到 config.add_view . 此行为与1.7系列中添加的新CSRF功能一致。参见https://github.com/pylons/pyramid/pull/2534

1.7B1(2016年4月25日)

  • 这个版本公布了1.7的测试期。

  • 修复了一个问题,其中一些文件被包含在从1.7系列中删除的炼金术骗局中。参见https://github.com/pylons/pyramid/issues/2525

1.7A2(2016年4月19日)

特征

  • 默认情况下,在异常视图上禁用自动CSRF检查。通过设置适当的 require_csrf 视图上的选项。参见https://github.com/pylons/pyramid/pull/2517

  • 自动CSRF API被改写为使用配置指令来设置选项。这个 pyramid.require_default_csrf 不再支持设置。相反,一个新的 config.set_default_csrf_options 引入了允许开发人员指定默认值的指令 require_csrf 以及更改CSRF令牌、头和安全请求方法。这个 pyramid.csrf_trusted_origins 仍支持设置。参见https://github.com/pylons/pyramid/pull/2518

错误修复

  • CSRF源代码检查有一个错误,导致检查总是失败。参见https://github.com/pylons/pyramid/pull/2512

  • 修复测试套件以在Windows上传递。参见https://github.com/pylons/pyramid/pull/2520

1.7A1(2016年4月16日)

向后不兼容

  • 在Pyramid折旧期(1.4->1.6)之后,AuthtktAuthenticationPolicy的默认哈希算法从MD5更改为SHA512。如果您使用的是身份验证策略,并且需要继续使用MD5,请将hashalg显式设置为“MD5”。

    此更改并不意味着任何现有的身份验证票证(和关联的cookie)将不再有效,用户将不再登录,并且必须重新登录到其帐户。

    参见https://github.com/pylons/pyramid/pull/2496

  • 这个 check_csrf_token 函数不再验证请求查询字符串中的CSRF令牌。只支持头和请求主体。参见https://github.com/pylons/pyramid/pull/2500

特征

  • 添加了新设置, pyramid.require_default_csrf 它可用于为应用程序中的每个POST请求全局打开CSRF检查。对于建立在Pyramid上的网站来说,这应该是一个很好的默认值。通过设置,可以根据每个视图选择退出CSRF检查 require_csrf=False 关于这些观点。参见https://github.com/pylons/pyramid/pull/2413

  • 增加了一个 require_csrf 查看选项,该选项将使用RFC2616定义的不安全方法对任何请求执行CSRF检查。如果CSRF检查失败 BadCSRFToken 异常将被引发并可能被异常视图捕获(默认响应是 400 Bad Request )应使用此选项代替已弃用的 check_csrf 视图谓词,通常会导致意外 404 Not Found 响应客户端而不是可捕获的异常。请参阅https://github.com/pylons/pyramid/pull/2413和https://github.com/pylons/pyramid/pull/2500

  • 添加了一个额外的CSRF验证,用于检查请求的来源/引用并确保其与当前请求匹配 request.domain . 此特定检查仅在通过HTTPS访问网站时有效,否则浏览器不会始终发送所需信息。如果额外的CSRF验证失败, BadCSRFOrigin 异常将被引发并可能被异常视图捕获(默认响应为 400 Bad Request )可通过设置配置其他允许的来源 pyramid.csrf_trusted_origins 允许的域名列表(如果在非标准端口上,则带有端口)。除非域名前面加了前缀,否则不允许使用子域。 . . 参见https://github.com/pylons/pyramid/pull/2501

  • 增加了一个新的 pyramid.session.check_csrf_origin 用于根据请求的域验证源或引用头的API。参见https://github.com/pylons/pyramid/pull/2501

  • pyramid httpexceptions现在将考虑客户机accept头的最佳匹配,并根据请求返回文本/html、application/json或文本/plain。默认值为 / 仍然是text/html,但如果明确提到application/json,它现在将收到有效的json响应。参见https://github.com/pylons/pyramid/pull/2489

  • 引入了一个新的事件和接口(遍历之前),它将在路由器中开始遍历之前通知侦听器。参见https://github.com/pylons/pyramid/pull/2469和https://github.com/pylons/pyramid/pull/1876

  • 将新的“视图派生器”概念添加到Pyramid中,以允许框架作者将元素插入到标准的Pyramid视图管道中,并影响应用程序中的所有视图。这与decorator类似,只是它可以访问传递给 config.add_view 并且可能影响管道的其他阶段,例如视图中的原始响应或安全检查之前的原始响应。参见https://github.com/pylons/pyramid/pull/2021

  • 允许领导 = 在请求参数谓词的键上。例如,“=abc=1”等于 request.params['=abc'] == '1' . 参见https://github.com/pylons/pyramid/pull/1370

  • 一个新的 request.invoke_exception_view(...) 方法,可用于调用异常视图并返回响应。这对于呈现excview tween上下文之外的异常视图很有用,因为您可能需要对请求进行更多的控制。参见https://github.com/pylons/pyramid/pull/2393

  • 允许使用变量替换,例如 %(LOGGING_LOGGER_ROOT_LEVEL)s 用于记录.ini文件的节并从 pserve 命令行——例如: pserve development.ini LOGGING_LOGGER_ROOT_LEVEL=DEBUG 参见https://github.com/pylons/pyramid/pull/2399

文件变更

  • 对文件进行全面检查:

    • 使用pip而不是简单的安装。

    • 倾向于使用python 3.4或更高版本来简化python及其所需的打包工具的安装,从而获得一致的看法。

    • 对工具使用venv,对创建的对象使用虚拟环境,而不是virtualenv。

    • 使用py.test和py test cov代替鼻子和覆盖范围。

    • 对脚手架以及教程及其SRC文件的进一步更新。

    参见https://github.com/pylons/pyramid/pull/2468

  • 全面检修 alchemy scaffold以及wiki2 sqlacalchemy+urldispatch教程将更多现代功能引入到使用sqlacalchemy with pyramid中,并为新项目提供更好的起点。参见https://github.com/pylons/pyramid/pull/2024

漏洞修补

  • 固定 pserve --browser 使用 --server-name 在选择要使用的节时,不要使用应用程序名称。例如,这仅适用于具有相同名称的服务器和应用程序部分的用户。 [app:main][server:main] . 参见https://github.com/pylons/pyramid/pull/2292

废弃

  • 这个 check_csrf 视图谓词已被弃用。使用新的 require_csrf 选项或 pyramid.require_default_csrf 设置以确保 BadCSRFToken 引发异常。参见https://github.com/pylons/pyramid/pull/2413

  • python 3.3的支持将在1.8Pyramid中移除。https://github.com/pylons/pyramid/issues/2477

  • python 2.6不再受Pyramid的支持。参见https://github.com/pylons/pyramid/issues/2368

  • 放弃了对python 3.2的支持。参见https://github.com/pylons/pyramid/pull/2256

1.6(2016年1月3日)

废弃

  • 继续移除 pserve 通过取消预测的守护进程/进程管理功能 --user--group 选项。参见https://github.com/pylons/pyramid/pull/2190

16立方(2015-12-17)

向后不兼容

  • 移除 cachebust 选项从 config.add_static_view . 见 config.add_cache_buster 对于将缓存buster附加到Static Assets的新方法。参见https://github.com/pylons/pyramid/pull/2186

  • 修改 pyramid.interfaces.ICacheBuster API是一个简单的可调用的,而不是具有 matchpregenerate 方法。高速缓存终结者现在只专注于生成。匹配已删除。

    注意:这会影响 pyramid.static.QueryStringCacheBusterpyramid.static.ManifestCacheBuster .

    参见https://github.com/pylons/pyramid/pull/2186

特征

  • 添加新的 config.add_cache_buster 用于将缓存buster附加到Static Assets的API。参见https://github.com/pylons/pyramid/pull/2186

漏洞修补

  • 确保 IAssetDescriptor.abspath 始终返回绝对路径。有些情况取决于进程CWD将返回相对路径。看到了吗https://github.com/Pylons/pyramid/pull/2188

1.6B2(2015年10月15日)

特征

  • 允许将资产规格提供给 pyramid.static.ManifestCacheBuster 而不需要文件系统路径。

1.6B1(2015年10月15日)

向后不兼容

  • IPython和BPython支持已经从核心的pshell中移除。要继续在Pyramid1.6+上使用它们,必须显式安装绑定包::

    $ pip install pyramid_ipython
    
    or
    
    $ pip install pyramid_bpython
    
  • 删除1.6A1中引入的默认缓存buster,包括 PathSegmentCacheBusterPathSegmentMd5CacheBusterQueryStringMd5CacheBuster . 参见https://github.com/pylons/pyramid/pull/2116

特征

  • 附加Shell pshell 现在可以注册为入口点。参见https://github.com/pylons/pyramid/pull/1891和https://github.com/pylons/pyramid/pull/2012

  • 注入的变量 pshell 现在显示文档字符串而不是默认值 str(obj) 如果可能的话。参见https://github.com/pylons/pyramid/pull/1929

  • 添加新 pyramid.static.ManifestCacheBuster 用于外部资产管道以及叙述中常见用法的示例。参见https://github.com/pylons/pyramid/pull/2116

  • 固定 pserve --reload 不要因为语法错误而崩溃!!!!参见https://github.com/pylons/pyramid/pull/2125

  • 当用户将未分析的字符串传递给 pyramid.session.CookieSessionpyramid.authentication.AuthTktCookieHelper 与时间相关的参数 timeoutreissue_timemax_age 它需要一个整数值。参见https://github.com/pylons/pyramid/pull/2050

漏洞修补

  • pyramid.httpexceptions.HTTPException 现在默认为 520 Unknown Error 而不是 None None 符合WebOB 1.5的变化。参见https://github.com/pylons/pyramid/pull/1865

  • pshell 现在将保留变量的大小写 [pshell] INI文件的节。这使得向shell公开类更加简单。看到了吗https://github.com/Pylons/pyramid/pull/1883

  • 固定使用 pserve --monitor-restart --daemon 会以可怕的方式失败。参见https://github.com/pylons/pyramid/pull/2118

  • 明确阻止 pserve --reload --daemon 不会被使用。它从未得到支持,但会以奇怪的方式工作和失败。参见https://github.com/pylons/pyramid/pull/2119

  • 运行时修复Windows上的问题 pserve --reload 其中进程无法复刻,因为找不到要运行的pserver脚本。参见https://github.com/pylons/pyramid/pull/2138

废弃

  • 贬低 pserve --monitor-restart 有利于用户使用真正的流程管理器(如SystemD或新贵)以及基于Python的解决方案(如Circus和Supervisor)。参见https://github.com/pylons/pyramid/pull/2120

1.6A2(2015年6月30日)

漏洞修补

  • 确保 pyramid.httpexceptions.exception_response 为返回适当的“concrete”类 400500 状态代码。见https://github.com/pylons/pyramid/issues/1832

  • 修复1.6a1中引入的无限递归错误,当 pyramid.view.render_view_to_response 直接或间接调用。参见https://github.com/pylons/pyramid/issues/1643

  • 通过在返回的内容前加上注释,进一步修复JSONP呈现器。这将减轻Flash的攻击(请参阅CVE-2014-4671)。参见https://github.com/pylons/pyramid/pull/1649

  • 允许句点和括号 ([] )在jsonp回调中。原来的修复是过度限制和打破角。参见https://github.com/pylons/pyramid/pull/1649

1.6A1(2015年4月15日)

特征

  • 如果用当前环境中已存在或可导入的项目名称的参数调用,则pcreate现在将请求确认。请参阅https://github.com/pylons/pyramid/issues/1357和https://github.com/pylons/pyramid/pull/1837

  • 使子类成为可能 pyramid.request.Request 并使用 pyramid.request.Request.add_request.method . 参见https://github.com/pylons/pyramid/issues/1529

  • 这个 pyramid.config.Configurator 已经增强了允许操作在提交周期内调用其他操作的能力。这使得更多的逻辑可以放在行动中,例如调用其他行动或将其分组以改进冲突检测的能力。我们还公开并记录了Pyramid使用的配置阶段,以便进一步帮助构建符合要求的插件。参见https://github.com/pylons/pyramid/pull/1513

  • 添加 pyramid.request.apply_request_extensions 可用于测试以应用通过以下方式配置的任何请求扩展的函数 config.add_request_method . 以前,只有通过Pyramid的路由器才能测试扩展。参见https://github.com/pylons/pyramid/pull/1581

  • pcreate when run without a scaffold参数现在将打印缺少标志的信息以及可用脚手架的列表。参见https://github.com/pylons/pyramid/pull/1566和https://github.com/pylons/pyramid/issues/1297

  • 增加了对“PYPY3”在TOX和Travis下的支持/测试。参见https://github.com/pylons/pyramid/pull/1469

  • 跨PY2和PY3自动化代码覆盖度量,而不仅仅是PY2。参见https://github.com/pylons/pyramid/pull/1471

  • 静态资源的缓存总线已添加,并且通过新参数可用于 pyramid.config.Configurator.add_static_viewcachebust . 核心API通过查询字符串和路径段为缓存总线提供,并且可以扩展到定制资产管道中。参见https://github.com/pylons/pyramid/pull/1380和https://github.com/pylons/pyramid/pull/1583

  • 添加 pyramid.config.Configurator.root_package attribute和init参数,用于帮助包含的包解析与包相关的资源,其中 Configurator 创建。这对于需要从设置中加载资产规格的加载项尤其有用,在这种情况下,开发人员可以自然地定义相对于顶级包的导入或资产。参见https://github.com/pylons/pyramid/pull/1337

  • 在脚手架中的日志格式化程序中添加行号以帮助调试。参见https://github.com/pylons/pyramid/pull/1326

  • 为状态代码添加新的HTTP异常对象 428 Precondition Required429 Too Many Requests431 Request Header Fields Too Large 在里面 pyramid.httpexceptions . 请参阅https://github.com/pylons/pyramid/pull/1372/files

  • 这个 pshell 脚本现在将加载 PYTHONSTARTUP 文件(如果在启动解释器之前在环境中定义了一个)。参见https://github.com/pylons/pyramid/pull/1448

  • 简单地定义希望使用默认异常响应视图但谓词和其他配置选项已更改的未找到和禁止视图。这个 view 参数现在是可选的 config.add_notfound_viewconfig.add_forbidden_view …参见https://github.com/pylons/pyramid/issues/494

  • 大大提高了 pcreate shell脚本输出。参见https://github.com/pylons/pyramid/pull/1453

  • 提高在 AuthTktCookieHelper 以及 SignedCookieSessionFactory 通过使用stdlib的 hmac.compare_digest 如果可用(如python 2.7.7+和3.3+)。参见https://github.com/pylons/pyramid/pull/1457

  • 当使用 config.override_asset 应用程序编程接口。这使得在仍然能够使用 request.static_url API和 config.add_static_view . 以前不可能使用 config.add_static_view 有绝对路径 and 生成内容的URL。此更改将取代呼叫, config.add_static_view('/abs/path', 'static')config.add_static_view('myapp:static', 'static')config.override_asset(to_override='myapp:static/', override_with='/abs/path/') . 这个 myapp:static 资产规格是完全组成的,不需要存在-它用于通过 request.static_url('myapp:static/foo.png') . 参见https://github.com/pylons/pyramid/pull/1252

  • 补充 pyramid.config.Configurator.set_response_factory 以及 response_factory 关键字参数 Configurator 用于定义将返回自定义 Response 类。参见https://github.com/pylons/pyramid/pull/1499

  • 允许从呈现器返回迭代器。以前只能返回字节或Unicode。参见https://github.com/pylons/pyramid/pull/1417

  • pserve 现在可以采取 -b--browser 在Web浏览器中打开服务器URL的选项。参见https://github.com/pylons/pyramid/pull/1533

  • 整体改善 proutes 命令。补充 --format--glob 命令的参数,引入了 method 用于显示可用请求方法的列,并改进了 view 通过显示模块而不是仅显示 __repr__ . 参见https://github.com/pylons/pyramid/pull/1488

  • 在python 3的视图中只支持关键字参数和函数注释。参见https://github.com/pylons/pyramid/pull/1556

  • request.response 当使用 pyramid.renderers.render_to_response() 应用程序编程接口。现在有必要通过 response= 参数 render_to_response 如果要为渲染器提供自定义响应对象供其使用。如果不传递一个响应对象,则将使用应用程序的 IResponseFactory . 几乎所有渲染器都会改变 request.response 响应对象(例如,JSON渲染器集 request.response.content_typeapplication/json )但是,当调用 render_to_response 不期望返回的响应对象与稍后在请求中使用的响应对象相同。从返回的响应对象 render_to_response 现在明显不同于 request.response . 这不会更改渲染器的API。参见https://github.com/pylons/pyramid/pull/1563

  • 这个 append_slash 的参数 `Configurator().add_notfound_view() 现在将接受实现 IResponse 接口,并将其用作响应类,而不是默认的 HTTPFound . 参见https://github.com/pylons/pyramid/pull/1610

漏洞修补

  • JSONP呈现器以这样的方式创建了javascript代码:回调变量可用于将javascript任意注入响应对象。https://github.com/pylons/pyramid/pull/1627

  • 解决一个问题 pserve --reload 如果在PDB会话期间重新加载,则会禁用终端回显。参见https://github.com/pylons/pyramid/pull/1577,https://github.com/pylons/pyramid/pull/1592

  • pyramid.wsgi.wsgiapppyramid.wsgi.wsgiapp2 现在提高 ValueError 意外通过时 None . 参见https://github.com/pylons/pyramid/pull/1320

  • 解决这样一个问题:谓词可能会被分解为“内省”中的点,但在注册时不会被分解。这就意味着 add_route_predicate 例如,不能取字符串并将其转换为实际的可调用函数。参见https://github.com/pylons/pyramid/pull/1306

  • 固定 pyramid.testing.setUp 归还 Configurator 有合适的包装。以前不能使用返回的 Configurator 测试期间。现在有一个 package 也可以重写此行为的参数。参见https://github.com/pylons/pyramid/pull/1322

  • 解决以下问题: pyramid.response.FileResponse 可以在不属于的地方应用字符集。参见https://github.com/pylons/pyramid/pull/1251

  • 解决Python2.7.7在Windows中引入的一个bug,其中 mimetypes.guess_type 返回内容类型的unicode而不是str,这与任何早期版本的python不同。更多信息请参见https://github.com/pylons/pyramid/issues/1360。

  • pcreate 现在,通过将连字符转换为下划线来规范化包名称。参见https://github.com/pylons/pyramid/pull/1376

  • 解决最终响应/完成回调无法向列表中添加另一个回调的问题。参见https://github.com/pylons/pyramid/pull/1373

  • 修复不同OSS中不同mimetype导致的单元测试失败。参见https://github.com/pylons/pyramid/issues/1405

  • 修复没有路径的静态视图资源规范的路由生成。参见https://github.com/pylons/pyramid/pull/1377

  • 允许 pyramid.renderers.JSONP 即使没有有效的请求对象,渲染器也可以工作。在这种情况下,它不会在回调中包装对象,因此其行为与 pyramid.renderers.JSON 渲染器。参见https://github.com/pylons/pyramid/pull/1561

  • 阻止“要加载的参数已弃用” DeprecationWarning 来自SETUPTOOLS>=11.3。参见https://github.com/pylons/pyramid/pull/1541

  • 避免共享 IRenderer 当使用 renderer= 参数。这些渲染器在第一次渲染时被实例化,并在请求之间共享,导致潜在的细微影响,如 pyramid.reload_templates = true 未能在 pyramid_mako . 请参阅https://github.com/pylons/pyramid/pull/1575和https://github.com/pylons/pyramid/issues/1268

  • 避免针对CSRF令牌的定时攻击。参见https://github.com/pylons/pyramid/pull/1574

  • request.finished_callbacksrequest.response_callbacks 现在默认为iterable而不是 None . 可以检查长度为0。这是1.5中的行为。

废弃

  • 这个 pserve 命令的后台监控功能已被弃用。这包括 [start,stop,restart,status] 子命令以及 --daemon--stop-server--pid-file--status 旗帜。

    请在将来使用真正的流程管理器,而不是依赖 pserve 去监控自己。存在许多选项,包括操作系统的服务(如systemd或upstart),以及基于python的解决方案(如circus和supervisor)。

    参见https://github.com/pylons/pyramid/pull/1641

  • 更名为 principal 参数 pyramid.security.remember()userid 以明确其预期目的。参见https://github.com/pylons/pyramid/pull/1399

文档

  • 将文档移动到 acceptConfigurator.add_view 不再是谓词列表的一部分。请参阅https://github.com/pylons/pyramid/issues/1391,获取一份声明 not_ 失败了 accept . 与@mcdonc的讨论得出结论,不应将其作为谓词进行记录。请参阅https://github.com/pylons/pyramid/pull/1487了解此公关

  • 删除了快速教程ini文件中的日志配置,除了脚手架和日志相关章节,以避免过早解释。

  • 澄清之前暗示的 ISession.invalidate API文档。

  • 改进和澄清关于Pyramid定义为 principal 和A userid 在它的安全API中。参见https://github.com/pylons/pyramid/pull/1399

  • 添加命令行程序的文档 (p* 脚本)。参见https://github.com/pylons/pyramid/pull/2191

脚手架

  • 更新脚手架生成机械,以返回Pyramid和Pyramid文档的版本,以便在脚手架中使用。更新了starter、alchemy和zodb模板,以链接到正确版本的文档,并反映用于生成脚手架的Pyramid。

  • 从模板中删除了非ASCII版权符号,因为这导致脚手架无法生成项目。

  • 现在您可以通过 tox py2-scaffoldstox py3-scaffolds .

1.5(2014年4月8日)

  • python 3.4兼容性。

  • 避免碰撞 pserve --reload 在py3k下,当迭代可能发生变异时 sys.modules .

  • UnencryptedCookieSessionFactoryConfig 如果机密包含高阶字符,则失败。参见https://github.com/pylons/pyramid/issues/1246

  • 修正了一个错误 UnencryptedCookieSessionFactoryConfigSignedCookieSessionFactory 在哪里? timeout=None 将导致始终创建新会话。也在 SignedCookieSessionFactoryreissue_time=None 在修改会话时会导致异常。参见https://github.com/pylons/pyramid/issues/1247

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

1.5b1(2014年2月8日)

特征

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

1.5A4(2014-01-28)

特征

  • 更新新主题的脚手架,固定文件和样品项目。

漏洞修补

  • 依赖于WebOB的新版本,这样我们就可以修复一些关键的bug,这些bug是Pyramid中功能的ShowStopper。

  • 向JSONP响应添加尾随分号。这修复了旧IE版本的javascript语法错误。参见https://github.com/pylons/pyramid/pull/1205

  • 当配置程序 set_request_property 方法被使用或当配置器的 add_request_method 方法与 property=True 属性。请参阅https://github.com/pylons/pyramid/issues/1212。

1.5A3(2013年12月10日)

特征

  • 已添加授权API作为请求的方法: request.has_permission .

    request.has_permission 是基于方法的替代方法 pyramid.security.has_permission API和工作原理完全相同。旧的API现在已被弃用。

  • 属性API属性已添加到请求中,以便更轻松地访问身份验证数据: request.authenticated_useridrequest.unauthenticated_useridrequest.effective_principals .

    它们分别是 pyramid.security.authenticated_useridpyramid.security.unauthenticated_useridpyramid.security.effective_principals . 它们的操作完全相同,只是它们是请求的属性,而不是接受请求的函数。它们是属性,因此无法分配给它们。旧的基于函数的API现在已被弃用。

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

    python -3 -m pyramid.scripts.pserve development.ini
    
  • 添加了一个特定的子类 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

  • 锚定参数 pyramid.request.Request.route_urlpyramid.request.Request.resource_url 它们的衍生产品现在将通过URL引用进行转义,以确保最小的一致性。参见https://github.com/pylons/pyramid/pull/1183

  • 允许发送 _query_anchor 选项到 pyramid.request.Request.static_url 生成外部URL时。参见https://github.com/pylons/pyramid/pull/1183

  • 现在可以将字符串作为 _query 参数 pyramid.request.Request.route_urlpyramid.request.Request.resource_url 以及它们的衍生物。当发送字符串而不是列表或字典时。它是URL引用,但不需要在 k=v 形式。如果您希望使用不同于 x-www-form-urlencoded . 参见https://github.com/pylons/pyramid/pull/1183

  • pyramid.testing.DummyRequest 现在有一个 domain 属性以匹配新的WebOB 1.3 API。它的价值在于 example.com .

漏洞修补

  • 修复 pcreate 编写脚本,以便当目标目录名以斜杠结尾时,不会生成非工作的项目目录结构。之前说过 pcreate -s starter /foo/bar/ 产生不同于说的输出 pcreate -s starter /foo/bar . 前者工作不正常。

  • 修复 principals_allowed_by_permission 方法 ACLAuthorizationPolicy 所以它可以预测 __acl__ 资源论。以前它没有尝试调用 __acl__ 如果它是可调用的。

  • 这个 pviews 当URL需要自定义请求方法以执行遍历时,脚本不起作用。通过添加自定义方法和描述符 pyramid.config.Configurator.add_request_method 现在将出现,允许遍历继续。参见https://github.com/pylons/pyramid/issues/1104

  • 移除未使用的 renderer 论证从 Configurator.add_route .

  • 允许 BasicAuthenticationPolicy 使用非ASCII用户名和密码。字符集不是作为头的一部分传递的,不同的浏览器在UTF-8和Latin-1之间交替使用,因此策略现在尝试先用UTF-8解码,并将回退到Latin-1。看到了吗https://github.com/Pylons/pyramid/pull/1170

  • 这个 @view_defaults 现在应用于未找到和禁止的视图,这些视图被定义为修饰类的方法。参见https://github.com/pylons/pyramid/issues/1173

文档

  • 添加了一个“快速教程”以配合快速教程

  • 删除提及 pyramid_beaker 从文档。烧杯不再维护。指着人们 pyramid_redis_sessions 相反。

  • 为添加文档 pyramid.interfaces.IRendererFactorypyramid.interfaces.IRenderer .

向后不兼容

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

废弃

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

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

  • 这个 pyramid.security.has_permission API现已弃用。相反,使用新添加的 has_permission 请求对象的方法。

  • 这个 pyramid.security.effective_principals API现已弃用。而是使用新添加的 effective_principals 请求对象的属性。

  • 这个 pyramid.security.authenticated_userid API现已弃用。而是使用新添加的 authenticated_userid 请求对象的属性。

  • 这个 pyramid.security.unauthenticated_userid API现已弃用。而是使用新添加的 unauthenticated_userid 请求对象的属性。

依赖关系

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

1.5A2(2013年9月22日)

特征

  • 用户现在可以将点式python名称提供给 factory 参数配置器方法名为 add_{{view,route,subscriber}}_predicate (您可以传递引用工厂的点名称,而不是直接传递谓词工厂)。

漏洞修补

  • 在中修复异常 pyramid.path.package_name 解析没有的命名空间包的包名称时 __file__ 属性。

向后不兼容

  • 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部分中 pyramid.config.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部分中 ~pyramid.config.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。

  • 移除 request.response_* 不同的属性。自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_view 具有 use_subpath=True 参数。

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

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

  • 删除了影响和查询 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` constructor and its `` 安装程序“注册表”方法已被删除。这个 ``set_renderer_globals_factory 方法 pyramid.config.Configurator 也被移除。(内部) pyramid.interfaces.IRendererGlobals 接口也被删除。自1.1以来,这些参数、方法和接口已被弃用。使用A BeforeRender 事件订阅服务器如Pyramid叙述文档的“Hook”一章所述,而不是向配置程序提供渲染器全局值。

废弃

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

1.5A1(2013年8月30日)

特征

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

  • 现在,通过使用新的 route_nameroute_kwroute_remainder_name 论据 request.resource_urlrequest.resource_path . 请参阅标题为“混合URL生成”的“组合遍历和URL调度”文档章节的新部分。

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

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

  • 添加 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_ 类可用于任何值,该值是在这些上下文中传递的谓词值:

    • pyramid.config.Configurator.add_view

    • pyramid.config.Configurator.add_route

    • pyramid.config.Configurator.add_subscriber

    • pyramid.view.view_config

    • pyramid.events.subscriber

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

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

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

  • 这个 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。

  • 这个 AuthTktAuthenticationPolicy 现在使用时支持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 表单参数,他们一直这样做)。当表单参数不存在时,将尝试使用头。

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

    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

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

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

  • 这个 pyramid.config.Configurator.add_route 方法现在支持使用外部URL作为模式进行调用。有关更多信息,请参阅https://github.com/pylons/pyramid/issues/611和“url调度”一章中的文档部分。

漏洞修补

  • 不可能使用 pyramid.httpexceptions.HTTPException 作为 context 当您希望异常视图重写默认的异常视图时,将异常视图作为与HTTP相关的异常的非常通用的catchall。参见https://github.com/pylons/pyramid/issues/985

  • pyramid.reload_templates 设置为true,并重新加载变色龙模板,渲染器规范命名了一个宏(例如 foo#macroname.pt )重新加载模板后,由于文件更改,模板的呈现将生成整个模板体,而不仅仅是宏的呈现。请参阅https://github.com/pylons/pyramid/issues/1013。

  • 在将虚拟根与路由与 *traverse 以它的模式。现在,在这种配置中生成的遍历路径是正确的,而不是缺少前导斜杠的元素。

  • 修复了在某些情况下返回具有先前defname值的元组的Mako渲染器错误。更多信息请参见https://github.com/pylons/pyramid/issues/1037。

  • 使 pyramid.config.assets.PackageOverrides 对象实现的API __loader__ PEP 302中指定的对象。代理 __loader__ 由进口商设定,如有;否则加薪 NotImplementedError . 这使得pyramid静态视图覆盖在python 3.3下正常工作(以前不会)。更多信息请参见https://github.com/pylons/pyramid/pull/1015。

  • mako_templating :为非重要的 mako 由于上游 markupsafe 删除python 3.2支持。Mako模板将不再在MarkupSafe 0.17和Python 3.2的组合下工作(尽管MarkupSafe 0.17和Python 3.3或任何受支持的Python 2版本的组合都可以工作)。

  • 空间和点现在可能在Mako渲染器模板路径中。当在1.4a1中添加对新makodef语法的支持时,这一点就被打破了。参见https://github.com/pylons/pyramid/issues/950

  • pyramid.debug_authorization=true 现在将正确打印出来 Allowed 对于在中注册的视图 NO_PERMISSION_REQUIRED 而不是调用 permits 授权策略的方法。参见https://github.com/pylons/pyramid/issues/954

  • Pyramid无法安装在某些系统上,因为它与一些测试文件打包在一起,这些文件的名称中包含高阶字符。这些文件现在已被删除。参见https://github.com/pylons/pyramid/issues/981

  • pyramid.testing.DummyResource 没有定义 __bool__ ,所以python 3下的代码将使用 __len__ 为了寻找真理,这通常导致一个傻瓜资源的例子是“不可靠”而不是“真实”。参见https://github.com/pylons/pyramid/pull/1032

  • 这个 alchemy 当数据库是mysql时,scaffold会在创建表时中断。参见https://github.com/pylons/pyramid/pull/1049

  • 这个 current_route_url 方法现在默认将查询字符串附加到URL。参见https://github.com/pylons/pyramid/issues/1040

  • 制作 pserve.cherrypy_server_runner 兼容python 3。参见https://github.com/pylons/pyramid/issues/718

向后不兼容

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

  • 这个 route_url and route_path APIs no longer quote / to `` %2f``当替换值包含 / . 这是毫无意义的,因为wsgi服务器总是取消斜杠的引号,而且Pyramid从来没有看到引号。

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

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

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

1.4(2012年12月18日)

文档

  • 修复zodb教程中的功能测试

1.4B3(2012年12月10日)

  • 仅打包发布,无代码更改。由于tarball中的目录丢失,1.4b2是brownbag版本。

1.4b2(2012年12月10日)

文档

  • 脚手架现在符合PEP-8标准(至少在短暂的闪光时刻)。

  • 教程改进。

向后不兼容

  • 修改了 _depth 参数 pyramid.view.view_config 接受相对于调用 view_config 本身。因此,当它之前期望值为 1 或者更大,以反映 view_config 1个堆栈帧是否远离 venusian.attach ,此实现细节现在隐藏。

  • 修改了 _backframes 参数 pyramid.util.action_method 以与描述的更改类似的方式 _depth 上面。这个论点仍然没有正式记录,但可能被一些精神错乱的人在野外使用。

1.4b1(2012-11-21)

特征

  • 小孢子增强,它预期 pyramid.response.Response 对象可能从视图返回。如果视图返回的对象的类是此类,则某些代码是快捷方式。类似的微优化被用于 pyramid.request.Request.is_response .

  • 使在上使用变量参数成为可能 p* 命令 (pservepshellpviews 等)在表格中 a=1 b=2 所以您可以在参数化中填充值 .ini 文件,例如 pshell etc/development.ini http_port=8080 . 参见https://github.com/pylons/pyramid/pull/714

  • Pyramid事件处理程序的一个比较高级和模糊的特性是它们处理“多接口”通知的能力。传统上,这些通知向订阅服务器可调用提供了多个对象。例如,如果事件是通过如下代码发送的:

    registry.notify(event, context)
    

    在过去,为了捕获这样的事件,您必须编写并注册一个事件订阅服务器,该订阅服务器在其参数列表中同时提到了事件和上下文:

    @subscriber([SomeEvent, SomeContextType])
    def asubscriber(event, context):
        pass
    

    在许多以这种方式注册的订阅服务器可调用文件中,订阅服务器可调用文件中的逻辑通常完全忽略第二个和后续参数(例如 context 在上面的例子中可以忽略),因为它们通常作为事件的属性存在。你通常可以通过做得到相同的价值 event.context 或者类似的。

    在我们添加“订户谓词”之前,您需要在订户可调用体中添加一个通常被忽略的额外参数,这只是一个小麻烦,用于在1.4 alpha之前的版本中缩小订户将被执行的环境集。一旦添加了这些参数,麻烦就会升级,因为订阅服务器谓词需要接受与配置它们所针对的订阅服务器可调用文件相同的参数列表和arity。例如,如果您的代码中有这两个订户注册:

    @subscriber([SomeEvent, SomeContextType])
    def asubscriber(event, context):
        pass
    
    @subscriber(SomeOtherEvent)
    def asubscriber(event):
        pass
    

    您希望使用订阅服务器谓词:

    @subscriber([SomeEvent, SomeContextType], mypredicate=True)
    def asubscriber1(event, context):
        pass
    
    @subscriber(SomeOtherEvent, mypredicate=True)
    def asubscriber2(event):
        pass
    

    如果存在 mypredicate 订户谓词的编写方式使得它只接受 __call__ 无法对订阅使用它,该订阅在其订阅服务器接口列表中命名了多个接口。同样,如果编写了一个接受两个参数的订户谓词,则不能对仅命名单个接口类型的注册使用它。

    例如,如果创建此谓词:

    class MyPredicate(object):
        # portions elided...
        def __call__(self, event):
            return self.val == event.context.foo
    

    它不适用于多接口注册的订阅,因此在上面的示例中,当您尝试对 asubscriber1 ,它将在运行时失败,并出现类型错误,声称某个对象试图用太多参数调用它。

    为了绕过这个限制,您必须设计 mypredicate 谓词期望在其 __call__ 要么一个 event 参数(SomeOtherEvent对象) or 一对参数(someEvent对象和someContextType对象),可能是通过这样做:

    class MyPredicate(object):
        # portions elided...
        def __call__(self, event, context=None):
            return self.val == event.context.foo
    

    这是令人困惑和糟糕的。

    为了允许人们忽略订阅者可调用文件的未使用参数,并规范事件订阅者和订阅者谓词之间的关系,我们现在允许订阅者和订阅者谓词只接受一个 event 参数,即使它们已经订阅了涉及多个接口的通知。只接受一个参数的订阅服务器和订阅服务器谓词将接收传递给 notify ;这通常是(但不总是)事件对象。订阅查找中涉及的其他对象将被丢弃。现在可以编写只接受 event 即使它订阅了多个接口:

    @subscriber([SomeEvent, SomeContextType])
    def asubscriber(event):
        # this will work!
    

    这将防止您不必要地将订阅服务器可调用参数与订阅类型匹配,特别是在不使用订阅服务器中的任何参数(事件对象本身除外)的情况下。

    但是请注意,如果事件对象不是调用中的第一个对象 notify 你会遇到麻烦的。例如,如果首先使用上下文参数调用notify::

    registry.notify(context, event)
    

    您将无法利用事件专用功能。它将“工作”,但事件处理程序接收的对象将不是事件对象,而是上下文对象,这不会非常有用:

    @subscriber([SomeContextType, SomeEvent])
    def asubscriber(event):
        # bzzt! you'll be getting the context here as ``event``, and it'll
        # be useless
    

    现有的多参数订阅服务器继续工作而没有问题,因此如果系统通知使用多个接口,而第一个接口不是事件接口,则应继续使用这些订阅服务器。例如::

    @subscriber([SomeContextType, SomeEvent])
    def asubscriber(context, event):
        # this will still work!
    

    仅事件功能允许使用订阅服务器谓词,该谓词只接受多个接口订阅服务器注册和单个接口订阅服务器注册中的请求参数。您不需要根据订阅类型参数对谓词进行稍微不同的更改。相反,只需编写所有订户谓词,以便它们只接受 event 在他们 __call__ 对于使用事件作为第一个参数的订阅,即使那些接受不仅仅是 event .

    但是,同样的警告也适用于谓词和订阅服务器可调用文件:如果订阅的是多接口事件,而第一个接口不是事件接口,则谓词将无法正常工作。在这种情况下,需要匹配谓词 __call__ 参数排序和组合到接口的排序。例如,如果订阅的注册使用 [SomeContext, SomeEvent] ,您需要在谓词参数的顺序中反映这一点。 __call__ 方法:

    def __call__(self, context, event):
        return event.request.path.startswith(self.val)
    

    tl;dr:1)当使用多接口订阅时,始终使用事件类型作为第一个订阅注册参数;2)当1为真时,仅使用 event 在订阅服务器和订阅服务器谓词参数列表中,无论通知订阅服务器的接口有多少。这种组合将导致订阅服务器谓词的最大可重用性和最少的思想量。负责任地喝酒。

漏洞修补

  • 尝试定位属性时失败 __text__debug_routematch 设置为真或 pviews 使用了命令。参见https://github.com/pylons/pyramid/pull/727

文档

  • 将教程源文件与每个使用的脚手架呈现的文件同步。

1.4A4(2012年11月14日)

特征

  • pyramid.authentication.AuthTktAuthenticationPolicy 已更新以支持更新的哈希算法,如 sha512 . 如果可能的话,现有的应用程序应该考虑更新以提高默认MD5散列的安全性。

  • 增加了一个 effective_principals 路由和视图谓词。

  • 不允许从 authenticated_userid 或者是由返回的主体列表之一的用户ID effective_principals 作为字符串之一 system.Everyonesystem.Authenticated 当任何内置授权策略 pyramid.authentication 正在使用中。这两个字符串是为Pyramid内部使用而保留的,它们不会被接受为有效的用户ID。

  • 稍微好一点的调试日志记录来自 pyramid.authentication.RepozeWho1AuthenticationPolicy .

  • pyramid.security.view_execution_permitted 用于返回 True 如果找不到视图。现在提出了 TypeError 在这种情况下,异常是不合理的,因为断言不存在的视图是允许执行的。请参阅https://github.com/pylons/pyramid/issues/299。

  • 允许一个 _depth 参数 pyramid.view.view_config 这将允许其他软件对decorator进行有限的组合重用,这些软件希望提供与view_config非常类似的自定义decorator。

  • 允许将一个不可访问的修饰符传递给 pyramid.config.Configurator.add_view . 这允许视图由多个装饰器包装,而不需要自己组合装饰器。

漏洞修补

  • 如果渲染器返回 None ,结果响应的主体将显式设置为空字符串。相反,现在,主体保持不变,这允许渲染器通过使用例如 request.response.body = b'foo' . 渲染器设置的主体将在退出时被移除。参见https://github.com/pylons/pyramid/issues/709

  • 在不常见的情况下, pyramid_excview_tween_factory 可能无意中引发了 KeyError 寻找 request_iface 作为请求的属性。在这种情况下,它不再失败。参见https://github.com/pylons/pyramid/issues/700

  • match_paramphysical_path 谓词实现;返回false而不是引发异常。

  • pyramid.view.render_view 由于字节/Unicode不一致,在python 3.x下无法正常运行。参见https://github.com/pylons/pyramid/issues/721

废弃

  • pyramid.authentication.AuthTktAuthenticationPolicy 如果应用程序正在使用策略而没有显式传递 hashalg 参数。这是因为默认值是“md5”,理论上认为它会受到碰撞攻击。如果您真的想要“md5”,那么必须显式地指定它以消除警告。

文档

  • 所有使用的教程 pyramid.authentication.AuthTktAuthenticationPolicy 现在显式通过 sha512 作为一个 hashalg 参数。

内构件

  • 移动 TopologicalSorterpyramid.config.utilpyramid.util 移动 CyclicDependencyErrorpyramid.config.utilpyramid.exceptions 重命名 SingletonSentinel 并从 pyramid.config.utilpyramid.util ;这是为了将某天可能是API的东西移出 pyramid.config.util ,因为该包不应该从非Pyramid代码导入。TopologySorter仍然不是API,但可能会成为API。

  • 摆脱阴暗的蒙凯修补 pyramid.request.Requestpyramid.response.Response 内完成 __init__.py Pyramid。WebOB不再依赖于这一点。相反,Pyramid请求类的responseClass属性被分配给Pyramid响应类;这足以满足WebOB的要求,并像以前那样使用monkeypatching。

1.4A3(2012年10月26日)

漏洞修补

  • 匹配参数谓词的文本方法被修复以对其值进行排序。https://github.com/pylons/pyramid/pull/705的一部分

  • 1.4a pyramid.scripting.prepare 与同名的1.3系列函数的行为不同。特别是,如果传递了一个请求,它将不会设置 registry 请求的属性,如1.3。症状是将请求传递给 pyramid.paster.bootstrap (使用函数)没有 registry 属性可以假定注册表将通过Pyramid附加到请求。这一假设可以在1.3中作出,但不能在1.4中作出。现在也可以在1.4中进行假设(注册表附加到传递给引导或准备的请求)。

  • 当注册一个名为变色龙ZPT渲染器的视图配置时,其中包含一个宏名(例如 renderer='some/template#somemacro.pt )以及一个视图配置,其中没有指向同一模板的宏名(例如 renderer='some/template.pt' ,内部缓存可能会混淆这两者,您的代码可能呈现了一个而不是另一个。

特征

  • 允许将多个值指定给 request_param 将谓词作为序列查看/路由。以前只允许使用单个字符串值。参见https://github.com/pylons/pyramid/pull/705

  • 关于脚手架文件章节的注释 .ini 文件夹。

  • 在处添加了HTTP基本身份验证策略 pyramid.authentication.BasicAuthAuthenticationPolicy .

  • 配置器 testing_securitypolicy 方法现在返回它创建的策略对象。

  • 配置器 testing_securitypolicy 方法接受两个新参数: remember_resultforget_result . 如果提供,这些值将影响政策的结果 rememberforget 方法。

  • 由创建的DummySecurityPolicy testing_securitypolicy 现在设置 forgotten 政策价值(价值 True 当其 forget 方法被调用。

  • 由创建的DummySecurityPolicy testing_securitypolicy 现在设置 remembered 策略值,即 principal 当它的 remember 方法被调用。

  • 新的 physical_path 视图谓词。如果指定,该值应该是一个字符串或元组,表示通过遍历找到的上下文的物理遍历路径,以便将该谓词匹配为true。例如: physical_path='/'physical_path='/a/b/c'physical_path=('', 'a', 'b', 'c') . 这不是路径前缀匹配或regex,而是整个路径匹配。当某个对象被遍历到某个视图时,如果您希望始终潜在地显示该视图,这很有用,但是您不能确定它将是哪种类型的对象,因此不能使用 context 谓语。斜杠字符之间或元组元素中的单个path元素应为资源名称的Unicode表示形式,不应以任何方式进行编码。

1.4A2(2012年9月27日)

漏洞修补

  • 当试图在资产规范中确定mako defname和chameleon宏名称时,考虑到文件名中可能有连字符。参见https://github.com/pylons/pyramid/pull/692

特征

  • 一个新的 pyramid.session.check_csrf_token 增加了方便功能。

  • A check_csrf 添加了视图谓词。例如,现在可以 config.add_view(someview, check_csrf=True) . 当谓词被选中时,如果 csrf_token 价值在 request.params 与请求会话中的CSRF令牌匹配,将允许执行该视图。否则,将不允许执行。

  • 添加 Base.metadata.bind = engine 到炼金术模板,以便强制定义的表可以工作。

文档

  • 使用插入后所需的更改更新wiki2 sqla教程 Base.metadata.bind = engine 进入炼金术的脚手架。

1.4A1(2012年9月16日)

漏洞修补

  • 来自1.3分支的转发端口:未配置身份验证策略时,调用 pyramid.security.effective_principals 将无条件返回空列表。这是不正确的,应该无条件返回 [Everyone] 现在开始了。

  • 显式URL调度正则表达式现在可以包含冒号。https://github.com/pylons/pyramid/issues/629

  • 在Python3.2下的至少一个64位Ubuntu系统上,使用 view_config 装饰师造成了 RuntimeError: dictionary changed size during iteration 例外。它不再是了。更多信息请参见https://github.com/pylons/pyramid/issues/635。

  • 在makotemplates lookup中,检查uri是否已经调整,并将其恢复为资产规范。通常情况下,继承的模板或包含的组件都会发生这种情况。https://github.com/Pylons/pyramid/issues/606https://github.com/Pylons/pyramid/pull/607

  • 在Mako模板查找中,在将继承与资产规范混合时检查绝对URI(使用Mako目录)。网址:https://github.com/pylons/pyramid/issues/662

  • HTTP接受头未规范化,导致潜在的冲突视图注册未被注意。只有两个视图的大小写不同(“text/html”与“text/html”),现在将引发错误。https://github.com/pylons/pyramid/pull/620

  • 来自1.3分支的转发端口:向 accept 谓词在Python3下运行的金字塔应用程序中,您可能收到 TypeError: unorderable types: function() < function() 例外。

特征

  • python 3.3兼容性。

  • configurator.add_指令现在接受任意可调用文件,如部分或对象实现 __call__ 哪些没有 __name____doc__ 属性。请参阅https://github.com/pylons/pyramid/issues/621和https://github.com/pylons/pyramid/pull/647。

  • 现在可以添加第三方自定义视图、路由和订阅服务器谓词,供视图作者通过 pyramid.config.Configurator.add_view_predicatepyramid.config.Configurator.add_route_predicatepyramid.config.Configurator.add_subscriber_predicate . 例如,这样做:

    config.add_view_predicate('abc', my.package.ABCPredicate)
    

    可能允许视图作者在配置该谓词的应用程序中执行此操作:

    @view_config(abc=1)
    

    类似的特征存在于 add_routeadd_subscriber . 有关详细信息,请参阅挂钩一章中的“添加自定义视图、路由或订阅服务器谓词”。

    请注意,为支持上述功能所做的更改现在意味着只有使用相同“顺序”注册的操作才能相互冲突。以前是这样的,在不同的命令下注册的行为可能会发生冲突,但据我所知,从来没有任何事情依赖于这种行为(这有点愚蠢)。

  • 自定义对象可以通过定义一个 __json__ 对象类的方法。此方法应返回本机可序列化的值 json.dumps (例如整数、列表、字典、字符串等)。

  • JSON呈现器现在允许自定义类型适配器的定义将未知对象转换为JSON序列化。

  • 从本版本开始, 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的特殊支持。

  • config.add_request_method 已引入以支持使用任意可调用文件扩展请求对象。此方法扩展到上一个 config.set_request_property 通过支持方法和属性。此方法现在导致在请求构造时执行的代码少于 config.set_request_property 在版本1.3中。

  • 不要添加 ? 到由生成的URL request.resource_url 如果 query 提供了参数,但为空。

  • 不要添加 ? 到由生成的URL request.route_url 如果 _query 提供了参数,但为空。

  • 静态视图机械现在上升(而不是返回) HTTPNotFoundHTTPMovedPermanently 异常,这样就可以被未找到的视图(和其他异常视图)捕获。

  • Mako渲染器现在支持资产规格中的定义名称。当定义名称存在于资产规格中时,系统将在模板中呈现模板定义并返回结果。示例资产规格是 package:path/to/template#defname.mako . 这将呈现名为 defname 里面 template.mako 模板而不是呈现整个模板。在窗体中返回元组的旧方法 ('defname', {{}}) 从视图来看,支持向后兼容性,

  • 变色龙ZPT渲染器现在接受资产规格中的宏名称。当宏名称存在于资产规格中时,系统将呈现列为 define-macro 并返回结果,而不是呈现整个模板。示例资产规格: package:path/to/template#macroname.pt . 这将使宏定义为 macronametemplate.pt 模板而不是整个模板。

  • 当出现谓词不匹配异常(当由于谓词不起作用而没有视图匹配给定请求时,会看到异常),异常现在包含对不匹配谓词的文本描述。

  • add_permission 向配置程序中添加了指令方法。该指令注册了一个独立的许可证,可以在Pyramid自省系统中自省。因此,在Pyramid顶部构建的框架可以使用 permissions 自省的类别数据,以构建运行系统支持的全面权限列表。在添加此方法之前,权限已经在此自省类别中注册,作为在 add_view 调用,此方法只允许安排将权限放入 permissions 自省的类别,而不将其与关联视图一起命名。以下是使用 add_permission ::

    config = Configurator()
    config.add_permission('view')
    
  • 这个 UnencryptedCookieSessionFactoryConfig 现在接受 signed_serializesigned_deserialize 可用于影响会话编组方式的Hook(默认情况下,这是通过hmac+pickle完成的)。

  • pyramid.testing.DummyRequest 现在支持由 pyramid.util.InstancePropertyMixin 类如 set_property .

  • 通过添加请求属性和方法 config.set_request_propertyconfig.add_request_method 现在提供给粗花呢。

  • 通过添加请求属性和方法 config.set_request_propertyconfig.add_request_method 现在在从返回的请求对象中可用 pyramid.paster.bootstrap .

  • request.context 环境要求期间 bootstrap 如果在提供的请求上尚未设置上下文,则现在是根对象。

  • 这个 pyramid.decorator.reify 函数现在是API,已添加到API文档中。

  • 增加了 pyramid.testing.testConfig 上下文管理器,可用于在测试中生成配置程序,例如 with testing.testConfig(...): .

  • 用户现在可以使用新的 request.invoke_subrequest 应用程序编程接口。

废弃

  • 这个 pyramid.config.Configurator.set_request_property 已弃用文档。该方法仍然可用,但更具特点 pyramid.config.Configurator.add_request_method 应在其位置使用(它具有所有相同的功能,但也可以使用方法扩展请求对象)。

向后不兼容

  • Pyramid路由器不再添加值 bfg.routes.routebfg.routes.matchdict 到请求的wsgi环境字典。这些值在 repoze.bfg 1.0(实际上是七个小版本)。如果代码依赖于这些值,请改用request.matched oute和request.matchdict。

  • 不能再将环境字典直接传递给 pyramid.traversal.ResourceTreeTraverser.__call__ (阿卡 ModelGraphTraverser.__call__ )相反,您必须传递一个请求对象。自Pyramid1.1以来,传递环境而不是请求已生成拒绝警告。

  • 如果您使用 webob.request.LegacyRequest 作为请求工厂。legacyRequest类的实例具有 request.path_info 它返回一个字符串。这个Pyramid释放假设 request.path_info 将无条件为Unicode。

  • 功能来自 pyramid.chameleon_zptpyramid.chameleon_text 已命名 get_rendererget_templaterender_templaterender_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_template` 相反。

    • 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__ 调用响应对象的方法 之后 执行完成的回调。这是为了支持 request.invoke_subrequest 特征。

  • 名为的200系列异常响应 HTTPCreatedHTTPAcceptedHTTPNonAuthoritativeInformationHTTPNoContentHTTPResetContentHTTPPartialContent 在里面 pyramid.httpexceptions 不再继承自 HTTPOk . 相反,它们从名为 HTTPSuccessful . 除非您为注册了异常视图,否则这对您没有影响。 HTTPOk 并期望异常视图捕获所有上述异常。

文档

  • 在叙述性文档中增加了“升级Pyramid”一章。它描述了如何处理PyramidAPI的拒绝和删除,以及如何在运行测试和运行服务器时显示Pyramid生成的拒绝警告。

  • 在文档中添加了“调用子请求”一章。它描述了如何使用新的 request.invoke_subrequest 应用程序编程接口。

依赖关系

  • Pyramid现在需要Webob 1.2b3+(之前的Pyramid版本仅依赖于1.2dev+)。这是为了确保我们获得返回 request.path_info 作为文本。

1.3(2012年3月21日)

漏洞修补

  • 什么时候? pyramid.wsgi.wsgiapp2 调用下游的wsgi应用程序,该应用程序的环境将不再具有(已弃用并可能误导) bfg.routes.matchdictbfg.routes.route 钥匙在里面。这个bug的症状是 wsgiapp2 -包装的Pyramid应用程序发现错误的视图,因为它错误地检测到一个路径是匹配的,而事实上,它不是。

  • 对问题的修复https://github.com/pylons/pyramid/issues/461(这使得可以将方法用作视图可调用文件)在使用只声明请求参数的方法时引入了向后不兼容。参见https://github.com/pylons/pyramid/issues/503

1.3B3(2012年3月17日)

漏洞修补

  • config.add_view(<aninstancemethod>) 引发了涉及 __text__ . 参见https://github.com/pylons/pyramid/issues/461

  • 删除引用以不执行任何操作 pyramid.debug_templates 在提供的所有Pyramid中设置 .ini 文件夹。此设置以前告诉变色龙渲染更好的异常;现在不管此设置的值如何,变色龙总是渲染好的异常。

脚手架

  • 这个 alchemy 如果创建项目的人忘记运行初始化脚本,scaffold现在会在浏览器中显示一条信息性错误消息。

  • 这个 alchemy 现在调用scaffold初始化脚本 initialize_<projectname>_db 而不是 populate_<projectname> .

文档

  • 由于Pycon US 2012 Sprints的协作,wiki教程得到了改进。

1.3b2(2012年3月2日)

漏洞修补

  • 方法 pyramid.request.Request.partial_application_url 已不在API文档中。它本来是一个私有方法;它在文档中作为API方法发布是一个错误,它被重命名为私有方法。

  • 在Windows上使用绝对文件系统路径注册静态视图时, request.static_url 函数无法生成指向其资源的URL。症状:“没有与C:\foo\bar\baz匹配的静态URL定义”。

  • 在Windows XP上通过所有测试。

  • python 3上的acl身份验证检查中的错误: permitsprincipals_allowed_by_permission 方法 pyramid.authorization.ACLAuthenticationPolicy 可能返回不适当的 True 值,条件是acl上的权限是字符串而不是序列,并且仅当acl权限字符串是 permission 传递给函数的值。

    这个bug不影响python 2下的Pyramid部署;它是一个bug,只存在于python 3上运行的部署中。它从Pyramid1.3A1开始就存在了。

    此错误是由于存在 __iter__ python 3下字符串的属性,而python 2中字符串下不存在该属性。

1.3b1(2012年2月26日)

漏洞修补

  • pyramid.config.Configurator.with_package 如果配置程序是旧样式,则无法工作 pyramid.configuration.Configurator 实例。

  • Pyramid授权策略没有出现在内省器中。

废弃

  • 所有引用 tmpl_context 请求变量已从文档中删除。它在Pyramid中的存在让从来就不是塔架使用者的人感到困惑。它被添加为Pyramid1.0中的塔架用户的移植便利,但它从未流行过,因为Pyramid渲染系统与塔架有很大的不同,并且存在其他方法来实现它在塔架中提供的功能。它将继续“永远”存在,但不会在文档中推荐或提及。

1.3A9(2012年2月22日)

特征

  • 添加一个 introspection 配置器构造函数的布尔值。如果这是 True ,使用配置器注册的操作将注册到自省器。如果是 False ,他们不会的。默认值是 True . 将其设置为 False 在操作过程中,将阻止对以下任何注册语句进行自省,并将其设置为 True 将再次启动它们。这个添加是为了满足调试工具栏自己的视图和方法不会出现在内省器中的需求。

  • 新API: pyramid.config.Configurator.add_notfound_view . 这是包装 pyramid.Config.configurator.add_view 它提供了简单的附加斜杠支持,并对权限做了正确的处理。最好不要打电话 add_view 直接与 context=HTTPNotFound 如前所述。

  • 新API: pyramid.view.notfound_view_config . 这是一个类似于 pyramid.view.view_config 那个电话 pyramid.config.Configurator.add_notfound_view 扫描时。最好不要使用 pyramid.view.view_config 具有 context=HTTPNotFound 如前所述。

  • 新API: pyramid.config.Configurator.add_forbidden_view . 这是包装 pyramid.Config.configurator.add_view 这是关于权限的正确做法。最好不要打电话 add_view 直接与 context=HTTPForbidden 如前所述。

  • 新API: pyramid.view.forbidden_view_config . 这是一个类似于 pyramid.view.view_config 那个电话 pyramid.config.Configurator.add_forbidden_view 扫描时。最好不要使用 pyramid.view.view_config 具有 context=HTTPForbidden 如前所述。

  • 新API: pyramid.response.FileResponsepyramid.response.FileIter ,用于必须“手动”提供文件的视图。

向后不兼容

  • 去除 pyramid.config.Configurator.with_context 类方法。它从来不是一个API,它只被 pyramid_zcml 它的功能已经转移到该包的最新版本。这意味着您需要使用0.9.2或更高版本的 pyramid_zcml 随着Pyramid的释放。

  • 这个 introspector 论据 pyramid.config.Configurator 已删除构造函数API。它已被布尔值替换 introspection 旗帜。

  • 这个 pyramid.registry.noop_introspector 已删除API对象。

  • 旧款已弃用 set_notfound_view 配置器方法现在是新的 add_notfound_view 配置器方法。同样,旧的被否决 set_forbidden_view 现在是新的 add_forbidden_view . 这有以下影响: context 发送到视图 (context, request) 呼叫签名通过 set_notfound_viewset_forbidden_view 现在将是异常对象,而不是找到的实际资源上下文。使用 request.context 以获取实际的资源上下文。也建议停用 set_notfound_view 赞成 add_notfound_view 和废弃 set_forbidden_view 赞成 add_forbidden_view 尽管有别名。

废弃

  • 的API文档 pyramid.view.append_slash_notfound_viewpyramid.view.AppendSlashNotFoundViewFactory 被移除。这些名称仍然存在并且仍然是可导入的,但它们不再是API。使用 pyramid.config.Configurator.add_notfound_view(append_slash=True)pyramid.view.notfound_view_config(append_slash=True) 得到同样的行为。

  • 这个 set_forbidden_viewset_notfound_view 从文档中删除了配置器的方法。自从Pyramid1.1以来,它们就被弃用了。

漏洞修补

  • 由使用的静态文件响应对象 config.add_static_view 打开静态文件两次,只需打开一次。

  • AppendSlashNotFoundViewFactory使用request.path来匹配路由。这是错误的,因为request.path包含脚本名,这将导致它在脚本名不为空的情况下失败。它应该使用request.path_info,现在可以了。

文档

  • 更新了“Hooks”一章的“Creating a Not Found View”部分,替换了使用 add_viewview_config 随着使用 add_notfound_viewnotfound_view_config .

  • 更新了“Hooks”一章的“Creating a Not Forbidden View”部分,替换了使用 add_viewview_config 随着使用 add_forbidden_viewforbidden_view_config .

  • 更新了“url调度”章节的“重定向到斜线附加路由”部分,替换了使用 add_viewview_config 随着使用 add_notfound_viewnotfound_view_config

  • 更新了所有要使用的教程 pyramid.view.forbidden_view_config 而不是 pyramid.view.view_config 具有httpForbidden上下文。

1.3A8(2012年2月19日)

特征

  • 这个 scan A方法 Configurator 可以通过 ignore 参数,可以是字符串、可调用或由字符串和/或可调用项组成的列表。此功能允许扫描子模块、子包和全局对象。看到了吗https://venusian.readthedocs.io/en/latest/#忽略-有关如何使用 ignore 参数 scan .

  • 当视图可调用返回无法转换为响应的值时(例如,当视图可调用返回未定义呈现器的字典或根本不返回任何值时),会出现更好的错误消息。错误消息现在包含关于视图可调用本身以及调用结果的信息。

  • 当仅.pyc模块为 config.include -ed.由于错误报告要求,这是不允许的,并且在尝试时会显示更好的错误消息。以前它会失败,比如“attributeError:'nonetype'对象没有属性'rfind'”。

  • 添加 pyramid.config.Configurator.add_traverser API方法。有关更多信息,请参阅标题为“更改遍历器”的Hooks叙述性文档部分。这不是一个新特性,它只是提供了一个API,用于添加遍历器,而不需要使用ZCA API。

  • 添加 pyramid.config.Configurator.add_resource_url_adapter API方法。有关详细信息,请参阅标题为“更改pyramid.request.request.resource_url如何生成URL”的hooks叙述性文档部分。这不是一个新特性,它只是提供了一个用于添加资源URL适配器的API,而不需要使用ZCA API。

  • 系统值 req 现在作为的别名提供给渲染器 request . 这意味着您现在可以,例如,在模板中 req.route_url(...) 而不是 request.route_url(...) . 这纯粹是为了减少在模板中使用请求方法和属性所需的输入量。价值 request 仍然可用,这只是一种选择。

  • 添加了一个新接口: pyramid.interfaces.IResourceURL . 实现其接口的适配器可用于在以下情况下重写资源URL生成: request.resource_url 被称为。此接口替换了现在已弃用的 pyramid.interfaces.IContextURL 接口。

  • 传递给资源的字典 __resource_url__ 方法(参见“资源”一章中的“覆盖资源URL生成”)现在包含 app_url 键,表示在 request.resource_url . 它表示可能自定义的URL前缀,其中包含用户传递给的可能自定义方案、主机和端口信息 request.resource_url . 应该用它来代替 request.application_url 必要时。

  • 这个 request.resource_url API现在接受这些参数: app_urlschemehostport . app_url参数可用于在生成url期间批量替换url前缀。这个 schemehostport 参数可用于替换 request.application_url 部分地。

  • 一个新的API request.resource_path 现在存在。它工作得很像 request.resource_url 但是会产生一个相对的URL而不是绝对的URL。

  • 这个 request.route_url API现在接受这些参数: _app_url_scheme_host_port . 这个 _app_url 参数可用于在URL生成过程中批量替换URL前缀。这个 _scheme_host_port 参数可用于替换 request.application_url 部分地。

向后不兼容

  • 这个 pyramid.interfaces.IContextURL 接口已弃用。已经指示人们使用它在“Hook”一章中注册一个资源URL适配器来影响 request.resource_url 自Pyramid1.0以来通过自定义遍历器找到的资源的URL生成。

    接口仍然存在,注册这样一个适配器仍然有效,但是这个接口将在几个主要的Pyramid版本发布后从软件中删除。你应该用等价物来代替它 pyramid.interfaces.IResourceURL 适配器,使用新的 pyramid.config.Configurator.add_resource_url_adapter 应用程序编程接口。当 pyramid.interfaces.IContextURL 在以下情况下找到适配器 request.resource_url 被称为。

文档

  • 不要创建 session 实例在sqla wiki教程中,使用raw DBSession 相反(这在真正的sqla应用中更常见)。

脚手架

  • pyramid.includes 目标在独立的线脚手架的ini文件中,以便能够告诉人们只评论 pyramid_debugtoolbar 行,当他们想禁用工具栏时。

依赖关系

  • 依靠 venusian >=1.0A3提供扫描 ignore 支持。

内部的

  • 创建一个“makorenderfactoryhelper”,提供可自定义的设置键前缀。允许设置前缀而不是“mako”。用于创建不使用全局mako设置的不同工厂。这将对调试工具栏很有用,该工具栏当前可能被使用自定义Mako配置设置的人破坏。

1.3A7(2012年2月7日)

特征

  • config.include 找不到 includeme . 请参阅https://github.com/pylons/pyramid/pull/392。

  • 内部:尽早捕获不可清除的鉴别器(引发错误而不是允许他们找到进入resolveConflicts的方法)。

  • 这个 match_param 视图谓词现在接受字符串或元组。这将取代接受dict的破坏行为。有关详细信息,请参阅https://github.com/pylons/pyramid/issues/425。

漏洞修补

  • pserve 用于 --reload 当标志 development.ini 文件(或使用中的任何其他.ini文件)已更改。请参阅https://github.com/pylons/pyramid/issues/377和https://github.com/pylons/pyramid/pull/411

  • 这个 prequest 当用于不返回HTML或文本的URL时,脚本将失败。参见https://github.com/pylons/pyramid/issues/381

向后不兼容

  • 这个 match_param 视图谓词不再接受dict。这不会产生负面影响,因为基于dict的参数的实现已中断。

文档

  • 在叙述文档中添加横向的hello world示例。

1.3A6(2012年1月20日)

特征

  • 新API: pyramid.config.Configurator.set_request_property . 向请求添加惰性属性描述符,而不更改请求工厂。此方法提供冲突检测,是向请求添加属性的建议方法。

  • 金字塔的反应 static_view 现在使用 wsgi.file_wrapper (请参阅https://www.python.org/dev/peps/pep-0333/可选平台特定文件处理),如果Web服务器提供了一个文件处理。

漏洞修补

  • 在中注册的视图 accept 无法用具有相同谓词参数的其他视图正确重写。更多信息请参见https://github.com/pylons/pyramid/pull/404。

  • 当为 view 参数 Configurator.add_view 指的是一个类 view_defaults decorator,将不应用视图默认值。请参阅https://github.com/pylons/pyramid/issues/396。

  • 静态URL路径被URL引用了两次。请参阅https://github.com/pylons/pyramid/issues/407。

1.3A5(2012年1月9日)

漏洞修补

  • 这个 pyramid.view.view_defaults 当多个视图依赖不同的默认值来解决配置冲突时,装饰器无法正常工作。请参阅https://github.com/pylons/pyramid/issues/394。

向后不兼容

  • 这个 path_info 路由和视图谓词现在与匹配 request.upath_info (Unicode)而不是 request.path_info (基于python 3与python 2的不确定值)。必须这样做才能规范化python 2和python 3上的匹配。

1.3A4(2012-01-05)

特征

  • 新API: pyramid.request.Request.set_property . 在不更改请求工厂的情况下向请求添加惰性属性描述符。新属性可以被重新定义,有效地缓存实例生命周期的值。这种方法的常见用例是获取请求的数据库连接或标识当前用户。

  • 使用 waitress wsgi服务器而不是 wsgiref 在脚手架中。

漏洞修补

  • 文件 pyramid.events.subscriber 指示将其用作没有类似以下参数的装饰器:

    @subscriber()
    def somefunc(event):
        pass
    

    将登记 somefunc 接收通过注册表发送的所有事件,但这是不真实的。相反,它不会接收任何事件。现在已修复此问题,代码与文档匹配。另请参见https://github.com/pylons/pyramid/issues/386

  • 路由模式的文本部分在 route_urlroute_path 用于生成URL或路径。

  • 结果 route_pathroute_url 可能是 unicodestr 取决于输入。现在保证永远 str .

  • 当模式在文本部分包含非ASCII字符时,URL匹配不确定。现在提供给 add_route 假设为: unicode 值,或 str 仅包含ASCII字符的值。如果现在想要匹配包含高阶字符的URL的路径信息,可以在模式中传递解码路径部分的Unicode表示。

  • 当使用 traverse= 如果遍历模式或匹配的动态段中存在任何高阶字符,则路由谓词遍历将失败,并出现urldecodeerror。

  • 使用名为 traverse 以这样的路线模式:

    config.add_route('trav_route', 'traversal/{traverse:.*}')
    

    会引起 UnicodeDecodeError 当路由匹配并且URL的匹配部分包含任何高阶字符时。请参阅https://github.com/pylons/pyramid/issues/385。

  • 当使用 *traverse 在路由模式中,一个与拥有 @@ 在其名称中(表示视图名称)在遍历过程中被遍历机器不适当地引用,导致视图找不到正确的位置。请参阅https://github.com/pylons/pyramid/issues/382和https://github.com/pylons/pyramid/issues/375。

向后不兼容

  • 传递给的字符串值 route_urlroute_path 这意味着取代“剩余”匹配现在将被URL引用除了嵌入斜杠。例如::

    config.add_route('remain', '/foo*remainder')
    request.route_path('remain', remainder='abc / def')
    # -> '/foo/abc%20/%20def'
    

    以前作为余数替换传递的字符串值附加在未接触的字符串上,没有任何URL引用。但是,如果传递的值是unicode(原始unicode不能放在URL或路径中),并且如果该值是字符串(除非被调用方引用,否则不会被引用),则在逻辑上这并不起作用。

    有些人会依赖旧的行为来附加查询字符串元素和URL的锚定部分;对不起,您需要更改代码以使用 _query 和/或 _anchor 论据 route_pathroute_url 现在就这么做。

  • 如果将包含非ASCII字符的字节串传递给 add_route 作为一种模式,它现在将在启动时失败。改为使用Unicode。

1.3A3(2011年12月21日)

特征

  • 增加了一个 prequest 脚本(沿着 paster request )它记录在标题为“调用请求”部分的“命令行Pyramid”一章中。

  • 添加未记录的 __discriminator__ 派生视图可调用文件的API。例如 adapters.lookup(...).__discriminator__(context, request) . 它将被超动态系统使用,这些系统要求在手动查找视图后使用鉴别器进行自省。

漏洞修补

  • 标准化出口值和 -h 全输出 p* 脚本 (pviewsproutes 等)。

文档

1.3A2(2011年12月14日)

特征

  • 新API: pyramid.view.view_defaults . 如果使用类作为视图,则可以使用 view_defaults 类上的类修饰符,以提供每个 @view_config 修饰该类的方法的修饰器。它还针对涉及强制类的视图配置工作。

  • 添加了向后兼容性旋钮 pcreate 仿真 paster create 处理 --list-templates 选择权。

  • 对脚手架机械进行了一些改动,以使想要使用可在Pyramid1.0.x、1.1.x、1.2.x和1.3.x上工作的扩展脚手架的人更容易操作。有关更多信息,请参阅叙述文档中新的“创建Pyramid脚手架”一章。

文档

  • 将文档添加到“视图配置”叙述文档章节 view_defaults 类修饰器。

  • 为添加了API文档 view_defaults 类修饰器。

  • 为添加了API文档章节 pyramid.scaffolds .

  • 增加了一个名为“创建Pyramid脚手架”的叙述性文档章节。

向后不兼容

  • 这个 template_renderer 方法 pyramid.scaffolds.PyramidScaffold 重命名为 render_template . 如果您要覆盖它,那么您就是一个坏人,因为它以前不是API。但是我们很好,所以我们会告诉你。

1.3A1(2011年12月9日)

特征

  • python 3.2兼容性。

  • 新的 pyramid.compat 模块和API文档,为Pyramid附加组件和开发环境提供python 2/3跨越式支持。

  • A mako.directories 使用mako模板不再需要设置理由:可以使用绝对资产规格指定mako模板渲染器。可以使用此类资产规格编写整个应用程序,无需排序查找路径。

  • bpython 中的解释程序兼容性 pshell . 有关更多信息,请参阅“命令行Pyramid”叙述文档一章。

  • 补充 get_appsettings API函数 pyramid.paster 模块。此函数返回在 [app:...] pastedeploy ini文件中的节。

  • 补充 setup_logging API函数 pyramid.paster 模块。此函数根据pastedeploy ini文件中的日志配置设置python日志记录。

  • 配置冲突报告以更易于理解的方式报告(“文件中的第11行…”,而不是类似信息的元组的repr)。

  • 增加了配置自省系统;更多信息,请参阅标题为“Pyramid配置自省”的叙述性文档章节。新API: pyramid.registry.Introspectablepyramid.config.Configurator.introspectorpyramid.config.Configurator.introspectablepyramid.registry.Registry.introspector .

  • 允许将额外的关键字参数传递给 pyramid.config.Configurator.action 方法。

  • 新API: pyramid.path.AssetResolverpyramid.path.DottedNameResolver . 前者可用于解析资产规格,后者可用于解析模块或包的点名称。

漏洞修补

  • 使测试套件通过32位系统;关闭286。关闭306。另请参见https://github.com/pylons/pyramid/issues/286

  • 这个 pyramid.view.view_config 装饰师不接受 match_params 谓词参数。参见https://github.com/pylons/pyramid/pull/308

  • AuthtktCookieHelper可能会在 tokens 使用了要记住的论点。参见https://github.com/pylons/pyramid/pull/314。

  • AuthtktAuthenticationPolicy未使用支持时间攻击的字符串比较器。更多信息请参见https://github.com/pylons/pyramid/pull/320。

  • pyramid.testing 现在,如果一个CSRF令牌还不存在,则生成一个新的CSRF令牌。

  • request.static_url 现在生成URL引用的URL path 包含不适合URL的字符的参数。更多信息请参见https://github.com/pylons/pyramid/issues/349。

  • 防止命名脚手架呈现 site (与python internal site.py冲突)。

  • 支持将实例用作 pyramid.wsgi.wsgiapppryramid.wsgi.wsgiapp2 功能。更多信息请参见https://github.com/pylons/pyramid/pull/370。

向后不兼容

  • pyramid不再运行在python 2.5上(在本文撰写之时,它包括jython的最新版本和gae的python 2.5版本)。

  • 这个 paster 命令不再是创建项目、启动服务器或运行调试命令的文档化方式。要从脚手架创建项目, paster create 替换为 pcreate 控制台脚本。为一个项目服务, paster serve 替换为 pserve 控制台脚本。名为的新控制台脚本 pshellpviewsproutesptweens 做他们的事 paster <commandname> 过去的等价物。理由:Paste和PasteScript包不在Python3下运行。

  • 默认的wsgi服务器作为 pserve 新粉刷的脚手架现在是 wsgiref wsgi服务器而不是 paste.httpserver 服务器。理由:理由:粘贴和粘贴脚本包不在Python3下运行。

  • 这个 pshell 命令(参见“paster pshell”)不再接受 --disable-ipython 命令行参数。相反,它接受 -p--python-shell 参数,可以是任何值 pythonipythonbpython .

  • 移除 pyramid.renderers.renderer_from_name 功能。自Pyramid1.0以来,它已被弃用,并且从未是API。

  • 要将zcml与pyramid>=1.3的版本一起使用,您需要 pyramid_zcml 版本>=0.8和 zope.configuration 版本>=3.8.0。这个 pyramid_zcml 包版本0.8向后兼容到Pyramid1.0,因此如果安装了旧版本并“就位”升级Pyramid,您将不会收到警告;相反,它可能会断开。

依赖关系

  • Pyramid不再依赖于 zope.component 包,作为测试依赖项除外。

  • Pyramid现在依赖于zope.interface>=3.8.0,webob>=1.2dev,repoze.lru>=0.4,zope.deprecation>=3.5.0,translationString>=0.4(用于python 3兼容性目的)。它还作为测试依赖项,出于同样的原因依赖于WebTest>=1.3.1。

  • Pyramid不再依赖于粘贴或粘贴脚本包。

文档

  • sqlacalchemy wiki教程已更新。现在使用 @view_config 修饰器和显式数据库填充脚本。

  • zodb wiki教程的小更新。

  • 添加了一个名为“扩展Pyramid配置”的叙述性文档章节;它描述了如何添加新指令以及如何使用 pyramid.config.Configurator.action 自定义指令中的方法。它还描述了如何添加自省对象。

  • 增加了一个名为“Pyramid结构反思”的叙述性文档章节。介绍了如何查询自省系统。

脚手架

  • 渲染的脚手架现在已经被更改为更可重定位(在包中的文件中很少提到包名称)。

  • 这个 routesalchemy 脚手架已重命名 alchemy ,替换旧的(基于遍历) alchemy 脚手架(已退休)。

  • 这个 starter 默认情况下,scaffold现在使用URL调度。

1.2(2011年9月12日)

特征

  • 路由模式替换标记名称现在可以以下划线开头。请参阅https://github.com/pylons/pyramid/issues/276。

1.2b3(2011年9月11日)

漏洞修补

  • 在“include”中添加静态视图时未考虑路由前缀。参见https://github.com/pylons/pyramid/issues/266。

1.2B2(2011年9月8日)

漏洞修补

  • 1.2b1 tarball是一个brownbag(特别是对于Windows用户),因为它包含的文件名在不适当的地方带有引号。我们依靠 setuptools-git 为了生成发布tarball,当运行它来生成1.2b1 tarball时,它还不能很好地处理Git存储库中文件名中包含高阶字符的文件。

文档

  • 对“引言”叙述章节示例应用程序和措辞的细微改动。

1.2b1(2011年9月8日)

漏洞修补

  • 有时会从地域翻译中退缩 (de_DE )到语言翻译 (de )使用定位器时无法正常工作。参见https://github.com/pylons/pyramid/issues/263

  • 静态文件服务机制无法服务以 . (点)字符。

  • 静态视图无法提供名称中包含高阶(超级ASCII)字符的静态文件。当从文件系统请求文件时,为机器提供服务的静态文件在文件名中不适当地使用了URL引用的路径段。

  • pyramid.traversal.traversal_path , canonicalize URL segments from UTF-8 to Unicode before checking whether a segment matches literally one of ., the empty string, or .. 以防有人在解码前通过与文本不匹配的UTF-8对这些字符串进行隧道传输。

文档

  • 在引言叙述章节中增加了“Pyramid的独特之处”一节。

1.2A6(2011年9月6日)

漏洞修补

  • authtktauthenticationpolicy具有 reissue_time 干扰注销。请参阅https://github.com/pylons/pyramid/issues/262。

内部的

  • 将以前依赖的代码内化为从 paste.auth 模块(FutureProof)。

  • 替代使用 paste.urlparser.StaticURLParser 使用ChrisRossi的“快乐”静态文件服务代码(FutureProof)的派生。

  • 固定测试套件;在某些系统上,由于测试运行顺序不确定和共享测试变量的双推单弹出,测试将失败。

行为差异

  • 当服务静态文件时,不再设置etag头。设置最后修改的标题。

  • 静态文件服务不再支持 wsgi.file_wrapper 延伸。

  • 而不是返回 403 Forbidden 错误:当提供的静态文件由于文件权限而无法被Pyramid进程的用户访问时,将引发IOERROR(或类似的)错误。

脚手架

  • 所有脚手架现在都发送 cache_max_age 参数 add_static_view 方法。

1.2A5(2011年9月4日)

漏洞修补

  • 这个 route_prefix 在某些情况下,在注册路由时没有正确考虑配置器的。参见https://github.com/pylons/pyramid/issues/260

依赖关系

  • 这个 zope.configuration 包不再是依赖项。

1.2A4(2011年9月2日)

特征

  • 支持一个 onerror 关键字参数 pyramid.config.Configurator.scan() . 此onerror关键字参数传递给 venusian.Scanner.scan() 在扫描期间引发异常时影响错误行为。

  • 这个 request_method 谓词参数 pyramid.config.Configurator.add_viewpyramid.config.Configurator.add_route 现在允许是HTTP方法名的元组。以前它被限制为表示单个HTTP方法名的字符串。

  • 未删节的 pyramid.traversal.find_modelpyramid.traversal.model_pathpyramid.traversal.model_path_tuplepyramid.url.model_url 在Pyramid1.0中都被弃用了。把它们作为它们重命名后的别名永远保留下来,只需要很少的成本。 resource_* 带前缀的函数。

  • 未删节的 pyramid.view.bfg_view 在Pyramid1.0中已弃用。这是一个低成本的别名 pyramid.view.view_config 我们将永远留在这里。

依赖关系

  • Pyramid现在需要金星1.0A1或更好的支持 onerror 关键字参数 pyramid.config.Configurator.scan .

1.2A3(2011年8月29日)

漏洞修补

  • Pyramid没有正确生成静态URL pyramid.url.static_url 由于1.2A1中的重构而传递调用程序包的相对路径时。

  • 这个 settings 对象在任何时候都发出拒绝警告 __getattr__ 被召唤。然而,在一些合法的情况下 __getattr__ 对任意对象(例如 hasattr )现在, settings 对象仅在成功查找时发出警告。

内部的

  • 使用 config.with_package 在视图中配置decorator而不是制造新的渲染器助手(清理)。

1.2A2(2011年8月27日)

漏洞修补

  • 当A renderers= 参数没有指定给配置器构造函数,而是急切地注册并提交默认的呈现器集。这允许覆盖默认的渲染器,该渲染器在1.2A1中被破坏,在配置器构造之后没有直接提交。

  • Mako呈现异常的错误消息值错误。

  • include无法成功设置根工厂,因为配置器构造函数无条件地注册了一个根工厂,该根工厂将被视为“用户的字”。

特征

  • 现在可以使用点式名称语法传入会话工厂。

1.2A1(2011年8月24日)

特征

  • 这个 [pshell] ini配置文件中的节现在处理 setup 键作为点名称,指向传递给引导环境的可调用项。它可以改变大正义所需的环境。

  • 名为的新配置设置 pyramid.includes 现在可用。在“环境变量和 .ini “文件设置”叙述性文档章节。

  • 增加了一个 route_prefix 论据 pyramid.config.Configurator.include 方法。此参数允许您将URL调度应用程序组合在一起。请参阅“URL调度”叙述性文档章节中标题为“使用路由前缀组成应用程序”的部分。

  • 增加了一个 pyramid.security.NO_PERMISSION_REQUIRED 用于的常量 permission= 查看配置的语句。此常量的值为字符串 __no_permission_required__ . 这个字符串值以前在文档中引用过;现在文档使用常量。

  • 添加了一种基于装饰器的配置响应适配器的方法: pyramid.response.response_adapter . 这个装饰器和 pyramid.config.Configurator.add_response_adapter 但它是声明性的。

  • 这个 pyramid.events.BeforeRender 事件现在有一个名为 rendering_val . 这可用于自省beforerender订阅服务器中视图返回的值。

  • 新的配置程序指令: pyramid.config.Configurator.add_tween . 此指令添加了一个“tween”。“tween”用于包装Pyramid路由器的主要请求处理功能。这是Pyramid框架扩展可以使用的一个特性,例如,提供视图计时支持,并作为挂起簿记代码的方便位置。

    Tweens在Hooks一章的叙述文档一节中作了进一步的描述,称为“注册Tweens”。

  • 新建粘贴程序命令 paster ptweens 打印应用程序的当前“tween”配置。有关更多信息,请参阅叙述文档的命令行Pyramid章节中标题为“显示Tweens”的部分。

  • Pyramid调试记录器现在使用标准的日志配置(通常通过粘贴作为启动的一部分来设置)。这意味着,例如 debug_notfounddebug_authorization 等将进入正常的测井通道。调试记录器的记录器名称将是 呼叫者 配置器的构造函数。

  • 请求对象上有一个新属性可用: exc_info . 它的价值将是 None 直到一个异常被Pyramid路由器捕获,之后它将是 sys.exc_info() .

  • pyramid.testing.DummyRequest 现在实现 add_finished_callbackadd_response_callback 方法。

  • 新的方法 pyramid.config.Configurator 类: set_authentication_policyset_authorization_policy . 这些内容主要由附加组件作者使用。

  • 新的配置器方法: set_root_factory .

  • Pyramid不再急于在配置器构造时提交一些默认的配置语句,这允许将值作为构造函数参数(例如 authentication_policyauthorization_policy )覆盖通过“包含”获得的相同设置。

  • 更好的Mako渲染例外通过 pyramid.mako_templating.MakoRenderingException

  • 新的请求方法: current_route_urlcurrent_route_pathstatic_path .

  • 中的新函数 pyramid.urlcurrent_route_pathstatic_path .

  • 这个 pyramid.request.Request.static_url API(及其同类产品) pyramid.request.Request.static_pathpyramid.url.static_urlpyramid.url.static_path )现在接受一个asbolute文件名作为“path”参数。只要文件名位于以前注册为静态视图的目录中,就会生成指向资产的URL。以前,尝试使用绝对文件路径生成资产的URL会引发ValueError。

  • 这个 RemoteUserAuthenticationPolicy `` ``AuthTktAuthenticationPolicySessionAuthenticationPolicy 构造函数现在接受一个名为 debug . 默认情况下,此关键字参数为 False . 当它是 True ,当 authenticated_userideffective_principals 对这些策略中的任何一个调用方法。当试图诊断与身份验证相关的问题时,生成的输出可能很有用。

  • 新建视图谓词: match_param . 示例:通过添加的视图 config.add_view(aview, match_param='action=edit') 只有当 request.matchdict 其中有一个名为的值 action 具有价值 edit .

内部的

  • Pyramid的“例外视图”机器现在作为一个“中间人”来实现。 (pyramid.tweens.excview_tween_factory

  • wsgihttpException(httpFound、httpNotFound等)现在有了一个名为“Prepare”的新API,当为其提供wsgi环境时,该API将呈现正文和内容类型。调试工具栏需要。

  • 一次 __call__prepare 在wsgihttpException上调用,将设置正文,并随后调用 __call__ 将始终返回相同的主体。删除body属性以重新传递异常体。

  • 以前 pyramid.events.BeforeRender 事件 一本词典 _system 属性)。现在它 is 字典(它继承自 dict ,它是作为顶级字典传递给模板的值。

  • 这个 route_urlroute_pathresource_urlstatic_urlcurrent_route_url 中的函数 pyramid.url 包现在根据已经传递的请求委托给一个方法,而不是反过来。现在,pyramid.request.request对象从名为pyramid.url.urlmethodmixin的mixin继承以实现此目的,并且所有URL/路径生成逻辑都嵌入到此mixin中。

  • 重构 pyramid.config 进入一个包。

  • 移除 _set_security_policies 配置器的方法。

  • 感动了 StaticURLInfo 类从 pyramid.staticpyramid.config.views .

  • 移动 Settings 类从 pyramid.settingspyramid.config.settings .

  • 移动 OverrideProviderPackageOverridesDirectoryOverrideFileOverride 类来自 pyramid.assetpyramid.config.assets .

废弃

  • 所有与Pyramid相关的部署设置(例如 debug_alldebug_notfound )现在要加前缀 pyramid. . 例如: debug_all > pyramid.debug_all . 旧的无前缀设置将无限期地继续工作,但提供这些设置最终可能会打印一个拒绝警告。所有脚手架和教程都已更改为使用前缀设置。

  • 这个 settings 当您试图通过 __getattr__ 而不是通过 __getitem__ .

向后不兼容

  • 如果字符串作为 debug_logger 配置程序的参数,该字符串被认为是全局python记录器的名称,而不是记录器实例的点状名称。

  • 这个 pyramid.config.Configurator.include 方法现在只接受一个 callable 参数(以前允许使用的可调用序列)。如果你超过一个 callablepyramid.config.Configurator.include ,它会断裂。现在您必须对每个可调用的方法进行单独的调用。这一变化是为了支持 route_prefix include的功能。

  • 在使用“自动提交”配置程序时,可能需要更strict地对配置路由和视图语句进行排序。在过去,当您使用自动提交配置程序时,可以在添加具有该名称的路由之前添加一个名为路由名称的视图。例如::

    config = Configurator(autocommit=True)
    config.add_view('my.pkg.someview', route_name='foo')
    config.add_route('foo', '/foo')
    

    当视图试图添加自身时,上述操作将引发异常。现在,在添加视图之前必须添加路由::

    config = Configurator(autocommit=True)
    config.add_route('foo', '/foo')
    config.add_view('my.pkg.someview', route_name='foo')
    

    这不会影响“普通”用户,只影响那些拥有使用自动提交配置器的遗留BFG代码库的用户,并且可能会影响使用configuratorapi(由 pyramid.testing.setUp 是自动提交配置程序)。解决这一问题的正确方法是使用非自动提交配置程序(默认设置),它没有这些指令排序要求。

  • 这个 pyramid.config.Configurator.add_route 指令不再返回路由对象。为了使路由与视图配置处理正常工作,需要进行此更改。

文档

  • 使用 route_urlroute_pathresource_urlstatic_urlcurrent_route_url 中的函数 pyramid.url 包现在已更改为使用请求的同名方法。

  • 在“URL调度”叙述性文档一章中增加了一节,标题为“使用路由前缀编写应用程序”。

  • 向API文档添加了一个新模块: pyramid.tweens .

  • 在“Hook”叙述章节中增加了“登记吐温”部分。

  • 在“命令行Pyramid”的叙述章节中增加了一个“显示中间人”部分。

  • 添加的文档 pyramid.tweenspyramid.includes “环境变量和 .ini 文件设置”章节。

  • 在叙述文档中添加了一个日志章节(基于塔架日志文档,谢谢Phil)。

  • 在叙述文档中添加了粘贴章节(从项目章节中移动内容)。

  • 增加了 pyramid.interfaces.IDict 表示字典方法的接口,仅用于文档目的(IMultidict和IBeferender从中继承)。

  • 所有教程现在都使用- route_urlroute_pathresource_urlstatic_urlcurrent_route_url 请求的方法,而不是从中导入的函数变量 pyramid.url .

  • zodb wiki教程现在使用 pyramid_zodbconn 包而不是 repoze.zodbconn 提供ZODB集成的包。

依赖关系更改

  • Pyramid现在依赖于pastescript>=1.7.4。此版本包含允许灵活日志配置的重要功能。

脚手架

  • 所有脚手架现在都使用 pyramid_tm 包而不是 repoze.tm2 管理事务管理的中间件。

  • ZODB脚手架现在使用 pyramid_zodbconn 包而不是 repoze.zodbconn 提供ZODB集成的包。

  • 所有脚手架现在都使用 pyramid_debugtoolbar 包而不是 WebError 提供交互式调试功能的包。

  • 通过脚手架创建的项目不再依赖于 WebError 包;配置在 production.ini 用于要求其 error_catcher 中间件已被删除。配置错误捕获/电子邮件发送现在是 pyramid_exclog 包(请参阅https://docs.pylonsproject.org/projects/pyramid-exclog/en/latest/)。

漏洞修补

  • 修复了默认渲染器在特定时间不工作的问题。参见https://github.com/pylons/pyramid/issues/249

1.1(2011年7月22日)

特征

  • 增加了 pyramid.renderers.null_renderer 对象作为API。空呈现器是一个对象,可以在高级集成案例中用作视图配置的输入。 renderer= 参数。当将空呈现器用作视图呈现器参数时,Pyramid避免将视图可调用结果转换为响应对象。如果您想在Pyramid路由器使用的上下文之外重用视图配置和查找机器,这是很有用的。此功能已由添加以供使用 pyramid_rpc 包,它使用视图配置和在路由器上下文之外的查找,完全是这样。 pyramid_rpc 从1.1b1开始,它就在1.1下被打破了;加上它,我们可以让它再次工作。

  • 更改指向docs.pylonsproject.org的所有脚手架模板以使用 /projects/pyramid/current 而不是 /projects/pyramid/dev .

内构件

  • 去除 compat 仅用于提供与Python2.4向后兼容性的代码。

  • 为非API函数添加反预测警告 pyramid.renderers.renderer_from_name 在野外也有使用。

  • 添加 clone 方法到 pyramid.renderers.RendererHelper 供使用 pyramid.view.view_config 装饰者。

文档

  • 修复了wiki2(sqla+url-dispatch)教程中的两个拼写错误。

  • 重新编排叙述部分的章节,以获得更好的新用户友好性。

  • 向文档中的节添加了更多索引标记。

1.1B4(2011年7月18日)

文档

  • 在“命令行Pyramid”一章中增加了一个标题为“编写脚本”的部分。

向后不兼容

  • 我们添加了 pyramid.scripting.make_request API在1.1B3中过于仓促。它已被移除。抱歉给您带来不便。使用 pyramid.request.Request.blank API代替。

特征

  • 这个 paster pshellpaster pviewspaster proutes 命令现在在引擎盖下使用 pyramid.paster.bootstrap 从而可以提供 .ini 不命名文件中指向实际Pyramid应用程序的“右”部分的文件。相反,你通常可以只跑 paster {{pshell|proutes|pviews}} development.ini 它将做最正确的事情。

漏洞修补

  • 在中呈现自定义异常模板时省略自定义环境变量 pyramid.httpexceptions.WSGIHTTPException._set_default_attrs ;字符串化THSE可能触发不应执行的代码;请参阅https://github.com/pylons/pyramid/issues/239

1.1B3(2011年7月15日)

特征

  • 修复角情况以简化视图的半功能测试:创建新的renderinfo以在重新扫描时清除旧注册表。请参阅https://github.com/pylons/pyramid/pull/234。

  • 新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.paster.bootstrap 已添加以使编写可轻松引导Pyramid环境的脚本,例如:

    from pyramid.paster import bootstrap
    info = bootstrap('/path/to/my/development.ini')
    request = info['request']
    print request.route_url('myroute')
    
  • 一个新的API函数 pyramid.scripting.prepare 已添加。这是一个较低水平的模拟 pyramid.paster.boostrap 它接受一个请求和一个注册表而不是一个配置文件参数,并用于相同的目的:

    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_app . 它还有一个 last 包含上次加载的注册表的属性。这是由脚本机制使用的,并且可用于自省。

废弃

  • 这个 pyramid.view.static 类已被弃用,取而代之的是较新的 pyramid.static.static_view 类。使用时会发出弃用警告。您应该用引用替换它 pyramid.static.static_viewuse_subpath=True 参数。

漏洞修补

  • 如果没有为域/区域设置组合加载mo文件, pyramid.i18n.Localizer.pluralize 使用该域/区域设置组合运行时引发了一个不可破解的“translations object has no attr'plural'”错误。现在,它“起作用”(默认情况下它使用日耳曼复数)。尝试将某些内容复数化而不翻译该区域设置/域是毫无意义的,但此行为与 pyramid.i18n.Localizer.translate 所以它至少是一致的;参见https://github.com/pylons/pyramid/issues/235。

1.1B2(2011年7月13日)

特征

  • 新环境设置 PYRAMID_PREVENT_HTTP_CACHE 和新的配置文件值 prevent_http_cache . 这些是同步的,允许您防止HTTP缓存头由Pyramid设置 http_cache 一个过程中的全球机械。请参阅“视图配置”叙述章节的“影响HTTP缓存”部分,以及“环境变量和配置设置”叙述章节中有关此设置的详细文档。

行为改变

  • 以前,如果 BeforeRender 事件订阅服务器通过 __setitem__update 具有已存在于渲染器全局字典中的键的事件对象的方法, KeyError 提高了。由于配置器的“添加渲染器全局”功能遭到拒绝,因此无法覆盖已存在的渲染器全局字典中的现有值。现在,事件对象将覆盖Globals字典中已经存在的旧值,当 __setitem__update 被称为(以及新的 setdefault 方法),就像一本普通的旧字典。因此,为了实现与其他第三方订阅服务器的最大互操作性,如果您编写了一个事件订阅服务器,该事件订阅服务器将被用作beforerender订阅服务器,那么您的订阅服务器代码现在需要(使用 .get__contains__ 在设置覆盖值之前,请确保渲染器全局字典中没有值。

漏洞修补

  • 这个 Configurator.add_route 方法允许添加具有相同路由的两个路由,但不添加中间路由 config.commit() . 如果你现在收到 ConfigurationError 在启动时, add_route 相关,您需要a)确保所有路由名称都是唯一的或b)呼叫 config.commit() 在使用先前添加的名称添加第二个路由之前,或c)使用在 autocommit 模式。

  • 这个 pyramid_routesalchemypyramid_alchemy 脚手架使用不当 DBSession.rollback() 而不是 transaction.abort() 在一个地方。

  • 我们现在明白了 request.response 在调用异常视图之前,异常视图将处理在异常之前未被任何代码接触过的request.response。

  • 使用棱锥图时,可能未正确查找与路由名称中包含空格的路由关联的视图。 zope.interface 3.6.4及以上。请参阅https://github.com/pylons/pyramid/issues/232。

文档

  • wiki2(sqlacalchemy+url调度)教程 models.initialize_sql 不匹配 pyramid_routesalchemy 同名的scaffold函数;在scaffold中更改时,它没有同步。

  • 视图配置叙述章节中的新文档部分:“影响HTTP缓存”。

1.1B1(2011年7月10日)

特征

  • 现在可以调用 paster pshell 即使其参数中指向的粘贴ini文件节名实际上不是PyramidWSGi应用程序。shell将在降级模式下工作,并警告用户。请参见“创建Pyramid项目”叙述文档部分中的“交互式Shell”。

  • paster pshell 现在默认提供更多内置全局变量(包括 appsettings )请参见“创建Pyramid项目”叙述文档部分中的“交互式Shell”。

  • 现在可以添加 [pshell] 应用程序的.ini配置文件的部分,它影响pshell会话可用的全局名称。参见“创建Pyramid项目”叙述性文档一章中的“扩展Shell”。

  • 这个 config.scan 方法已成长为 **kw 参数。 kw 参数表示要传递给金星人的一组关键字参数 Scanner 由Pyramid创建的对象。(有关更多信息,请参见金星文档 Scanner

  • 新请求属性: json_body . 此属性将返回请求体的JSON解码变量。如果请求主体不是格式良好的JSON,则此属性将引发异常。

  • 一种新的价值 http_cache 可以用作视图配置参数。

    当你提供一个 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}}) .

漏洞修补

  • 原始视图的框架包装器(如http-cached等)依赖于能够信任他们接收到的响应是一个IResponse。这并不总是如此,因为响应是由路由器解决的,而不是在视图包装过程的早期。这个问题已经解决了。

文档

  • 在“webob”章节中添加了一节,名为“处理JSON编码的请求体”(使用 request.json_body

行为改变

  • 这个 paster pshellpaster proutespaster pviews 命令现在采用表单中的单个参数 /path/to/config.ini#sectionname 而不是前两个参数的拼写 /path/to/config.ini sectionname . #sectionname 可省略,在这种情况下 #main 假设。

1.1A4(2011年7月1日)

漏洞修补

  • pyramid.testing.DummyRequest 当属性不推荐用于 pyramid.request.Request 被访问(如 response_content_type )这是为了让运行单元测试的人员受益,他们使用DummyRequest而不是“实际”请求,因此他们知道不推荐使用功能测试套件。

  • 这个 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
    

特征

  • 添加JSONP渲染器(请参见文档的“渲染器”一章中的“JSONP渲染器”)。

废弃

  • 贬低 set_renderer_globals_factory 配置器的方法和 renderer_globals 配置器构造函数参数。

文档

  • wiki和wiki2教程的“测试”章节都有两个错误:两个错误都没有告诉用户依赖webtest,两个测试由于对Pyramid本身的更改而失败。这些问题已得到解决。

  • 将1.0.x changes.txt条目移动到history.txt。

1.1A3(2011年6月26日)

特征

  • 补充 mako.preprocessor config file参数;允许将mako预处理器指定为python可调用或python点式名称。基本原理见https://github.com/pylons/pyramid/pull/183。

错误修复

  • 当试图设置一个 __text__ 一个自定义谓词的属性,它实际上是一个类方法。参见https://github.com/pylons/pyramid/pull/217。

  • 根据要求访问或设置不推荐使用的响应属性(例如 response_content_type )现在,在访问时而不是在呈现时发出拒绝警告。

1.1a2(2011年6月22日)

漏洞修补

  • 1.1A1通过不提供向后兼容的进口垫片来破坏Akhet pyramid.paster.PyramidTemplate . 现在已经添加了一个,尽管当Akhet导入它时会发出一个弃用警告。

  • 如果在一次调用中提供了多个规范 config.add_translation_dirs ,目录以错误的顺序插入到目录列表的开头:插入的顺序与提供的顺序相反。 *specs 列表(列表后面的项目在列表前面添加)。现在已修复。

向后不兼容

  • 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'] .

1.1A1(2011年6月20日)

文档

  • 术语“模板”指“粘贴模板”和“渲染模板”(由渲染引擎创建的模板)。i、 长尾蛇、变色龙、金贾等)。”“粘贴模板”现在将被称为“脚手架”,而“渲染模板”的名称将保留为“模板”

  • 这个 wiki (zodb+traversal)教程稍有更新。

  • 这个 wiki2 (sqla+url-dispatch)教程稍有更新。

  • 制作 pyramid.interfaces.IAuthenticationPolicypyramid.interfaces.IAuthorizationPolicy 公共接口,并在 pyramid.authenticationpyramid.authorization API文档。

  • 在中呈现每个公开接口的函数定义 pyramid.interfaces .

  • 将缺少的文档引用添加到 pyramid.config.Configurator.set_view_mapper 并在名为“使用视图映射器”的Hooks章节中参考它。

  • 在“环境变量和 .ini “文件设置”一章,标题为“添加自定义设置”。

  • 添加了“多维数据集”的文档(例如 request.POST )作为接口API文档。

  • 在“url-dispatch”叙述章节中添加了一节,介绍了新的“静态”路由功能。

  • 在文档的HTML呈现中添加了“Pyramid1.1中的新功能”。

  • 为添加了API文档 pyramid.authentication.SessionAuthenticationPolicy .

  • 为添加了API文档 pyramid.httpexceptions.exception_response .

  • 在视图叙述章节中添加了“HTTP例外”部分,包括对 pyramid.httpexceptions.exception_response .

特征

  • 添加对语言回退的支持:尝试为特定区域(如 en_GB )回到语言的翻译(即 en )这使翻译行为与GNUgetText一致,并在使用C扩展时修复部分翻译的文本。

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

  • 访问 response 的属性 pyramid.request.Request 对象(例如) request.response 在视图中)现在生成一个新的 pyramid.response.Response 对象。此功能主要用于配置了渲染器的视图需要设置响应属性时:所有渲染器都将使用 request.response 作为响应对象返回到路由器。

    request.response 也可以由不使用渲染器的视图中的代码使用,但是由生成的响应对象 request.response 当渲染器不在运行时必须返回(它不是“全局”响应)。

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

  • pyramid_alchemy 粘贴模板现在使用 query.get 而不是 query.filter_by 更好地利用身份映射缓存。

  • pyramid_alchemy 粘贴模板现在有单元测试。

  • 补充 pyramid.i18n.make_localizer API(从 get_localizer 胆子)

  • NewRequest事件订阅服务器引发的异常现在可以由异常视图捕获。

  • 现在可以从异常视图中获取有关为何Pyramid引发禁止异常的信息。这个 ACLDenied 返回的对象 permits 每种股票授权政策的方法 (pyramid.interfaces.IAuthorizationPolicy.permits )现在作为它的 result 属性。因此,如果您创建了一个禁止的异常视图,那么您可以看到请求中涉及的ace、acl、权限和主体,例如。 context.result.permissioncontext.result.acl 等等,在禁止异常视图的逻辑中。

  • 不要明确阻止 timeout 从低于 reissue_time 当设置 AuthTktAuthenticationPolicy (以前这样的配置会导致 ValueError 现在是允许的,尽管通常是胡说八道的)。允许无意义的配置使得代码更易于理解,并且需要更少的测试。

  • 名为 paster pviews 加入。此命令打印给定路径的潜在匹配视图的摘要。有关详细信息,请参阅叙述性文档“视图配置”一章中标题为“显示给定URL的匹配视图”的部分。

  • 这个 add_route 配置器的方法现在接受 static 参数。如果这个论点是 True ,在处理请求时,不会考虑将添加的路由进行匹配。相反,它只对通过 route_urlroute_path . 有关更多信息,请参阅URL调度叙述章节中标题为“静态路由”的部分。

  • 上下文的默认异常视图 pyramid.interfaces.IExceptionResponse 现在默认注册。这意味着从中导入的任何异常响应类的实例 pyramid.httpexceptions (如 HTTPFound )现在可以从视图代码内引发;引发时,此异常视图将把异常呈现给响应。

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

  • 配置程序现在接受一个名为 exceptionresponse_view . 默认情况下,此参数由默认的异常视图函数填充,该函数将在作为异常引发响应时使用。什么时候? None 为该值传递,将不注册响应的异常视图。经过 None 返回将HTTP异常引发到Pyramid1.0的行为(该异常将传播到中间件和WSGi服务器)。

  • 这个 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处理视图响应的方式”的“Hook”一章中的部分。

  • 默认情况下,Pyramid路由器现在将调用 __call__ 返回wsgi响应时Webob响应对象的方法。这意味着,除其他外, conditional_response WebOB响应对象的功能现在将正常工作。

  • 名为的新方法 pyramid.request.Request.is_response . 应使用此方法而不是 pyramid.view.is_response 函数,已弃用。

漏洞修补

  • 允许URL调度中使用的URL模式标记指定自定义regex。例如,模式 /{{foo:\d+}} 匹配手段 /12345 (匹配字典中的foo==12345)但不是 /abc . 然而,模式标记中使用弯曲括号的自定义正则表达式不起作用。例如, /{{foo:\d{{4}}}} 将无法匹配 /1234/{{foo:\d{{1,2}}}} 将无法匹配 /1/11 . 现在可以识别一个级别的内部波形括号,这样前面两个作为示例的模式现在可以工作了。另请参见https://github.com/Pylons/pyramid/issues/123。

  • 不要在AuthtktCookieHelper设置的cookie中发送端口号和域信息(请参阅https://github.com/pylons/pyramid/issues/131)。

  • pyramid.url.route_path (还有捷径 pyramid.request.Request.route_url 方法)现在在路径前面包含wsgi脚本的名称,如果它不是空的(请参见https://github.com/pylons/pyramid/issues/135)。

  • pyramid.testing.DummyRequest 现在有一个 script_name 属性(空字符串)。

  • 不要引用 :@&+$, 符号在 *elements 传递给 pyramid.url.route_urlpyramid.url.resource_url (参见https://github.com/Pylons/pyramid/pull/141).

  • 在由发出的重定向中包含脚本名称 pyramid.view.append_slash_notfound_view (参见https://github.com/Pylons/pyramid/issues/149).

  • 已注册的静态视图 config.add_static_view 其中还包括 permission 关键字参数不能按预期工作,因为 add_static_view 也在内部注册了一家路由工厂。因为路由工厂是在内部注册的,所以Pyramid许可机制检查的上下文从来没有ACL。 add_static_view 不再向工厂注册路由,因此将使用默认根工厂。

  • config.add_static_view 现在传递它接收到的额外关键字参数 config.add_route (调用add_static_view在逻辑上主要等同于添加类型的视图 pyramid.static.static_view 连接到带有子路径的路线上)。这样可以通过,例如, factory=add_static_view 使用自定义ACL保护特定静态视图。

  • testing.DummyRequest 使用错误的注册表(全局注册表)作为 self.registry 如果创建了虚拟请求 之前 testing.setUp 被处决 (testing.setUp 将本地注册表推送到线程本地堆栈)。通过实施修复 registry 作为DummyRequest的属性,而不是急于指定属性。另请参见https://github.com/pylons/pyramid/issues/165

  • 当访问一个表示静态视图的URL,该静态视图解析为一个子目录时, index.html 那个子目录的服务不好。相反,重定向到 /subdir 将发布。这已经被修复,现在访问的子目录包含 index.html 在静态视图中,正确返回index.html。另请参见https://github.com/pylons/pyramid/issues/67。

  • 静态视图发出的重定向未考虑任何现有的 SCRIPT_NAME (例如,一个由URL映射组合设置的集合)。现在他们做到了。

  • 这个 pyramid.wsgi.wsgiapp2 装饰师没有考虑 SCRIPT_NAME 在原始请求中。

  • 这个 pyramid.wsgi.wsgiapp2 decorator只在它修饰通过遍历找到的视图时有效地工作;它忽略了 PATH_INFO 这是URL调度匹配视图的一部分。

废弃

  • 已弃用对的所有分配 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 现在已弃用,赞成通过将视图连接到预定义路由 Configurator.add_view 使用路线的 route_name 参数。因此,上述示例现在应拼写为:

    config.add_route('home', '/')
    config.add_view('mypackage.views.myview', route_name='home')
                    renderer='some/renderer.pt')
    

    这样做是为了减少在IRC中观察到的混乱,以及(最终)减少文档负担(另见https://github.com/pylons/pyramid/issues/164)。当任何与视图相关的参数传递给 Configurator.add_route .

  • 路过 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对象)。在未来的版本中,这些方法将被完全删除。

  • 已弃用 pyramid.view.is_response 有利于(新增)的功能 pyramid.request.Request.is_response 方法。确定一个对象是否真的是一个有效的响应对象,现在需要访问注册表,注册表只作为请求属性很容易获得。这个 pyramid.view.is_response 函数在被删除之前仍然有效,但现在在某些(非常罕见)情况下可能返回错误的答案。

行为改变

  • 默认的Mako渲染器现在配置为转义表达式标记中的所有HTML。这有助于防止由于呈现用户未初始化的输入而导致的XSS攻击。要在用户模板中恢复此行为,他们需要通过“n”筛选器筛选表达式。例如,$myhtml n。参见https://github.com/pylons/pyramid/issues/193。

  • 现在需要自定义请求工厂返回具有 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.response.Response 现在是 子类 属于 webob.response.Response (为了直接执行 pyramid.interfaces.IResponse 接口。

  • “异常响应”对象可从导入 pyramid.httpexceptions (例如) HTTPNotFound )不再只是为实际生活在 webob.exc . 相反,我们在模块中定义了自己的异常类,该类镜像并模拟 webob.exc 异常响应对象几乎完全是。有关详细信息,请参阅名为“Pyramid使用自己的HTTP异常类”的“设计防御”文档部分。

向后不兼容

  • Pyramid不再支持python 2.4。运行Pyramid1.1+需要python 2.5或更高版本。

  • 默认情况下,Pyramid路由器现在期望从视图可调用文件返回的响应对象实现 pyramid.interfaces.IResponse 接口。与此接口的Pyramid1.0版本不同,现在实现IResponse的对象必须定义 __call__ 接受的方法 environstart_response ,返回 app_iter 除其他外,它是无可辩驳的。以前,可以返回任何具有三个WebOB的对象 app_iterheaderliststatus 属性作为响应,所以这是向后不兼容。通过将适配器注册为从现在从视图可调用文件返回的对象类型响应,可以恢复向后兼容性。请参阅文档“更改Pyramid处理视图响应的方式”的“Hook”一章中的部分。

  • 这个 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现在依赖于webob>=1.0.2,因为测试依赖于该版本中的错误修复:“修复对缺少的wsgi环境的处理 SCRIPT_NAME “。(请注意,实际上,每个人都应该使用1.0.4或更好的版本,因为Webob1.0.2和1.0.3是有效的brownbag版本。)

1.0(2011年1月30日)

文档

  • 修复了zodb wiki教程中的错误(缺少对 docutils 在“模型”中,请在 setup.py

  • 删除的API文档 pyramid.testing API命名 registerDummySecurityPolicyregisterResourcesregisterModelsregisterEventListenerregisterTemplateRendererregisterDummyRendererregisterViewregisterUtilityregisterAdapterregisterSubscriberregisterRouteregisterSettings .

  • 移动了“使用ZODB With ZEO”和“Using”寄存目录“金字塔内部”教程出了核心文档并进入金字塔教程网站(https://docs.pylonsproject.org/projects/pyramid_tutorials/en/latest/).

  • 在URL发送章节中更改了“请求后清理”部分以供使用 request.add_finished_callback 而不是用 __del__ 进入WSGi环境。

  • 删除重复的 add_route URL调度叙述章节中的API文档。

  • 删除中重复的API和叙述性文档 pyramid.view.view_config 指向的API文档 pyramid.config.add_view 文档和叙述章节文档。

  • 删除了文档叙述部分重复的一些API文档

  • 删除了sqlachemy+url dispatch wiki教程中的“总体身份验证流”,因为存在打印空间问题(移动到Pyramid教程网站)。

漏洞修补

  • 已弃用的-since-bfg-1.2 API来自 pyramid.testing 现在正确地发出拒绝警告。

  • 补充 egg:repoze.retry#retry zodb模板中的wsgi管道中间件(重试在正常操作中发生的zodb冲突错误)。

  • 已删除的重复实现 is_response . 存在两个相互竞争的实现:一个在 pyramid.config 其中一个 pyramid.view . 现在定义在 pyramid.view 由内部使用 pyramid.config 并继续作为API进行广告宣传。

1.0b3(2011年1月28日)

漏洞修补

  • 在粘贴模板/教程模板中使用&copy;而不是版权符号,这样有利于剪切粘贴并保存为非UTF8格式的用户。

  • pyramid.view.append_slash_notfound_view 现在保留跨重定向的get查询参数。

文档

  • 加强相关文件 set_default_permission :明确指出默认权限还保护异常视图。

  • 粘贴模板和教程现在在HTML模板中使用空格而不是制表符。

1.0B2(2011年1月24日)

漏洞修补

  • 这个 production.ini 由所有粘贴器模板生成的日志记录级别现在都是有效的警告级别,这可以防止诸如SQLAlchemy语句日志记录和其他不适当的输出。

  • 这个 production.inipyramid_routesalchemypyramid_alchemy 粘贴模板没有 sqlalchemy 记录器部分,防止 paster serve production.ini 从工作中。

  • 这个 pyramid_routesalchemypyramid_alchemy 粘贴模板使用 {{{{package}}}} 变量应该使用 {{{{project}}}} 变量,导致使用大写字母创建应用程序,例如 paster create -t pyramid_routesalchemy Dibbus 未能在以下情况下启动 paster serve development.ini 被用来对抗结果。看到了吗https://github.com/Pylons/pyramid/issues/107

  • 这个 render_view 方法 pyramid.renderers.RendererHelper 将不正确的值传递给的呈现器 renderer_info . 它现在传递一个 RendererHelper 而不是字典,这与其他用法是一致的。看到了吗https://github.com/Pylons/pyramid/issues/106

  • 一个存在于 pyramid.authentication.AuthTktCookieHelper 它将中断AuthtktAuthenticationPolicy在配置为重新颁发其令牌时的任何使用。 (reissue_time < timeout / max_age )症状: ValueError: ('Invalid token %r', '') . 看到了吗https://github.com/Pylons/pyramid/issues/108。

1.0b1(2011年1月21日)

特征

  • AuthtktAuthenticationPolicy现在接受 tokens 参数通过 pyramid.security.remember . 值必须是字符串序列。令牌被放入auth-tkt“tokens”字段,并返回到auth-tkt cookie中。

  • 添加 wild_domain authtktauthenticationpolicy的参数,默认为 True . 如果设置为 False ,将关闭使用通配符域设置cookie的策略功能。

  • 添加 MANIFEST.in 文件到每个粘贴模板。看到了吗https://github.com/Pylons/pyramid/issues/95

漏洞修补

  • testing.setUp 现在添加一个 settings 属性设置为注册表(当传递没有任何设置的注册表时,以及当它创建注册表时)。

  • 这个 testing.setUp 函数现在采用 settings 参数,应该是字典。其值随后将在返回的 config 对象AS config.registry.settings .

文档

  • 在文档的HTML呈现中添加了“Pyramid1.0中的新功能”一章。

  • 合并了凯斯曼大师的叙事编辑分支,许多措辞的修正和扩展。

  • 修复显示的已弃用示例 chameleon_zpt 测试叙述章节中的API调用。

  • 添加了“通过向配置器添加方法” add_directive “高级配置叙述章节。

  • 添加文档 add_finished_callbackadd_response_callbackroute_pathroute_urlstatic_url 方法到 pyramid.request.Request API文档。

  • 将有关在Mako模板中使用i18n的(最少)文档添加到“国际化和本地化”叙述章节。

  • 把“表单”章节的内容移回“视图”章节;我想不出一个更好的地方来放置它。

  • 稍微改进的接口文档 IAuthorizationPolicy .

  • 在URL调度章节中,至少解释URL调度替换标记中自定义正则表达式的用法。

废弃

  • 使用 pyramid.view.bfg_view 别名 pyramid.view.view_config (向后兼容垫片)现在发出警告。

向后不兼容

  • 使用 testing.setUp 现在注册一个isettings实用程序作为副作用。一些测试代码在 testing.setUp via queryadapter将期望返回值为 None . 需要更改此代码。

  • 当A pyramid.exceptions.Forbidden 出现错误,其状态代码为 403 Forbidden . 以前是这样的 401 Unauthorized ,以便向后兼容 repoze.bfg . 此更改将给使用Pyramid的用户带来问题 repoze.who ,截取 401 Unauthorized 默认情况下,但允许 403 Forbidden 通过。这些部署需要配置 repoze.who 对…也有反应 403 Forbidden .

  • 的默认值 cookie_on_exception 参数到 pyramid.session.UnencryptedCookieSessionFactory 现在是 True . 这意味着,当视图代码导致引发异常,并且会话发生变化时,将在响应中发送一个cookie。以前它的默认值是 False .

贴纸模板

  • 这个 pyramid_zodbpyramid_routesalchemypyramid_alchemy 当配置 repoze.tm2 中的事务管理器 development.ini . 这可以防止当响应状态代码在400或500范围内时提交事务。另请参见https://repozetm2.readthedocs.io/en/latest/index.html使用-a-承诺-否决。

1.0A10(2011年1月18日)

漏洞修补

  • URL调度现在可以正确处理 .** 在括号内使用时出现在regex匹配中。解决问题90。

向后不兼容

  • 这个 add_handler 配置器的方法已从金字塔核心中删除。处理程序现在是 pyramid_handlers 包,可以从PyPI下载。该软件包的文档可通过https://docs.pylonsproject.org/projects/pyramid_handlers/en/latest/,它描述了如何将配置语句添加到 main 阻止重新加入此方法。您还需要添加 install_requires 依赖于 pyramid_handlers 对你 setup.py 文件。

  • 这个 load_zcml 配置器的方法已从金字塔核心中删除。加载zcml现在是 pyramid_zcml 包,可以从PyPI下载。该软件包的文档可通过https://docs.pylonsproject.org/projects/pyramid zcml/en/latest/,它描述了如何将配置语句添加到 main 阻止重新加入此方法。您还需要添加 install_requires 依赖于 pyramid_zcml 对你 setup.py 文件。

  • 这个 pyramid.includes 子包已被删除。使用的zcml文件包括包 pyramid.includes (例如) <include package="pyramid.includes"/> )现在必须包括 pyramid_zcml 改为打包(例如 <include package="pyramid_zcml"/>

  • 这个 pyramid.view.action 装饰器已从Pyramid核心移除。处理程序现在是 pyramid_handlers 包。现在应该从 pyramid_handlers 例如 from pyramid_handlers import action .

  • 这个 handler ZCML指令已被删除。它现在是 pyramid_handlers 包。

  • 这个 pylons_minimalpylons_basicpylons_sqla 粘贴模板已删除。使用 pyramid_sqla (可从PYPI获得)作为桥塔式发展的通用替代品。

  • 这个 make_app 函数已从中删除 pyramid.router 模块。它继续生活在 pyramid_zcml 包。这就离开了 pyramid.router 没有任何API函数的模块。

  • 这个 configure_zcml 部署设置中的设置(在 **settings 传到Pyramid main 功能)不再有任何意义。

特征

  • pyramid.testing.setUppyramid.testing.tearDown 没有预先准备好。它们现在是测试配置的规范设置和拆卸API,取代了配置器的“直接”创建。这是一个设计用来提供一个外观的变更,它可以防止将来的配置程序被拒绝。

  • 添加 charset 属性到 pyramid.testing.DummyRequest (无条件地 UTF-8

  • 添加 add_directive 方法到配置器,它允许框架扩展器向配置器添加方法(ala zcml指令)。

  • 什么时候? Configurator.include 通过了 模块 作为参数,它默认为尝试查找和使用名为 includeme 在那个模块中。这样就可以使用 config.include('some.module') 而不是 config.include('some.module.somefunc') 只要包含函数在 some.module 被命名 includeme .

  • 这个 bfg2pyramid 脚本现在转换zcml include标记 repoze.bfg.includes 作为值的包属性 pyramid_zcml . 例如, <include package="repoze.bfg.includes"> 将转换为 <include package="pyramid_zcml"> .

贴纸模板

  • 所有贴纸模板现在都使用 pyramid.testing.setUppyramid.testing.tearDown 而不是在其内部“手动”创建配置程序 tests.py 模块,根据上述特征中的决定。

  • 这个 starter_zcml 粘贴模板已移动到 pyramid_zcml 包。

文档

  • wiki和wiki2教程现在使用 pyramid.testing.setUppyramid.testing.tearDown 而不是根据上述特性中的决定“手工”创建配置程序。

  • “测试”叙述章节现在解释了 pyramid.testing.setUppyramid.testing.tearDown 而不是配置器的创建和 Configurator.begin()Configurator.end() .

  • 文档 request.override_renderer 属性,位于名为“在运行时覆盖渲染器”的部分的“渲染器”一章中。

  • “声明性配置”叙述章节已被删除(它被移到 pyramid_zcml 包装)。

  • 在叙述章节中对zcml的大多数引用都被删除或重定向到 pyramid_zcml 位置。

废弃

  • 添加了与导入以下API函数相关的拒绝警告: pyramid.traversal.find_modelpyramid.traversal.model_pathpyramid.traversal.model_path_tuplepyramid.url.model_url . 拒绝警告发出的指令指示开发人员将这些方法拼写改为 resource 当量。这是在1.0A7中将“模型”重命名为“资源”的大量概念的结果。

1.0A9(2011年1月8日)

漏洞修补

  • 这个 proutes 命令试图解析要打印的视图,但由于遇到异常根工厂而导致异常。如果无法解析视图,它现在只打印 <unknown> .

  • 这个 self 参数包含在 ISession 接口签名,导致 pyramid_beaker 测试失败。

  • 雷丁 pyramid.traversal.model_path_tuple 作为别名 pyramid.traversal.resource_path_tuple 为了向后兼容。

特征

  • 添加新的API pyramid.url.current_route_url ,它根据“当前”路由(如果有)及其matchdict值计算URL。

  • config.add_view 现在接受 decorator 关键字参数,一个可调用项,它将在将视图可调用项添加到注册表之前修饰该视图。

  • 如果处理程序类提供 __action_decorator__ 属性(通常是ClassMethod或StaticMethod),将其用作该处理程序的每个视图注册的修饰器。

  • 这个 pyramid.interfaces.IAuthenticationPolicy 接口现在指定 unauthenticated_userid 方法。此方法支持使用不支持对象缓存且希望创建“用户对象”作为请求属性的持久存储的用户所需的重要优化。

  • 新的API已添加到 pyramid.security 模块命名 unauthenticated_userid . 此API函数调用 unauthenticated_userid 有效安全策略的方法。

  • unauthenticated_userid 方法已添加到由返回的虚拟身份验证策略 pyramid.config.Configurator.testing_securitypolicy . 它返回与虚拟身份验证策略的 authenticated_userid 方法。

  • pyramid.authentication.AuthTktCookieHelper 现在是一个API。此类可供第三方身份验证策略开发人员用于帮助进行身份验证cookie设置的机制。

  • 配置器的新构造函数参数: default_view_mapper . 用于创建具有备用视图调用约定的系统。视图映射器允许用作视图可调用文件的对象具有任意参数列表和任意结果。对象作为 default_view_mapper 应该实现 pyramid.interfaces.IViewMapperFactory 接口。

  • 添加一个 set_view_mapper 配置器的API。与传球结果相同 default_view_mapper 到配置器构造函数。

  • config.add_view 现在接受 mapper 关键字参数,应为 None ,表示python点式名称的字符串,或表示 IViewMapperFactory . 此功能对“平民”不有用,只对扩展编写器有用。

  • 允许在请求时通过名为的请求属性重写视图注册期间提供的静态呈现器 override_renderer ,它应该是以前注册的渲染器的名称。使用现有渲染视图提供“全向呈现”RPC很有用。

  • 实例 pyramid.testing.DummyRequest 现在有一个 session 对象,它主要是一个字典,但也实现了Flash和CSRF的其他会话API方法。

向后不兼容

  • 自从 pyramid.interfaces.IAuthenticationPolicy 接口现在指定策略实现必须实现 unauthenticated_userid 方法,所有第三方自定义身份验证策略现在都必须实现此方法。但是,只有当名为 pyramid.security.unauthenticated_userid 是被调用的,所以如果您不调用它,您将不会注意到任何问题。

  • pyramid.interfaces.ISession.get_csrf_token 现在要求实现返回 new 如果会话中不存在令牌(以前它将不返回)。内部会话实现已更改。

文档

  • (弱)“将CMF应用程序转换为Pyramid”教程已从教程部分中删除。它被移到 pyramid_tutorials Github存储库。

  • “资源定位和视图查找”一章已被Rob Miller的“关于遍历的许多麻烦”的变体(最初发表于https://web.archive.org/web/20150321110754/http://blog.non-quietarity.org/2010/much-ado关于遍历/)。

  • 许多小的措辞调整和重构(合并了凯西邓肯的文档复刻,他正在其中进行一般性编辑)。

  • 在Hooks叙述章节中添加了对新视图映射器功能的(弱)描述。

  • 将视图章节拆分为2:视图可调用文件和视图配置。

  • 在视图可调用文件之后,但在视图配置之前,重新排序渲染器和模板章节。

  • 将会话对象、跨站点请求伪造和FlashMessaging章节合并为单个会话章节。

  • wiki和wiki2教程现在有了更好的CSS和图形。

内构件

  • “视图派生”代码现在被分解成一组类,而不是大量独立的函数(视图映射器重构的副作用)。

  • 这个 pyramid.renderer.RendererHelper 类已经成长为 render_view 方法,由默认视图映射器使用(视图映射器重构的副作用)。

  • 对象作为 renderer “视图派生器”现在是 pyramid.renderers.RendererHelper 而不是字典(视图映射器重构的副作用)。

  • 在中用作“页面模板”的类 pyramid.chameleon_text 删除,而不是使用变色龙内置版本。

  • 在注册表中注册的视图可调用包装现在包含 __original_view__ 引用原始视图可调用(或类)的属性。

  • 以前命名的所有内部身份验证策略实现的(非API)方法 _get_userid 现在命名为 unauthenticated_userid ,升级为API方法。如果要重写此方法,现在需要将其重写为 unauthenticated_userid 相反。

  • 删除config.py名为“映射”视图的(非api)函数。

1.0A8(2010年12月27日)

漏洞修补

  • 名字 registry 在中不可用 paster pshell IPython的环境。

特征

  • 如果资源实现 __resource_url__ 方法,它将作为调用 pyramid.url.resource_url 函数生成URL,覆盖默认逻辑。请参阅参考资料叙述章节中新的“生成资源的URL”部分。

  • 添加了flash messaging,如“flash messaging”叙述性文档一章所述。

  • 增加了CSRF令牌生成,如标题为“防止跨站点请求伪造攻击”的叙述章节所述。

  • 防止误解 viewview_permission 如果视图相关参数存在但不存在,则通过在配置期间引发异常来添加路由工作的参数 view 参数已传递。

  • 添加 paster proute 显示路由表摘要的命令。请参阅标题为“显示所有应用程序路径”的“URL发送”章节中的叙述性文档部分。

贴纸模板

  • 这个 pyramid_zodb 粘贴模板不再使用zcml。相反,它是基于扫描。

文档

  • 在资源叙述章节中添加了“生成资源的URL”部分(包括有关使用 __resource_url__

  • 在“资源叙述”一章中增加了“生成资源路径”一节。

  • 在“资源叙述”一章中增加了“按路径查找资源”一节。

  • 在资源叙述章节中增加了“获取资源的血统”。

  • 在资源叙述章节中增加了“确定资源是否属于另一个资源的谱系”。

  • 在资源叙述章节中增加了“查找根资源”。

  • 在参考资料叙述章节中增加了“在沿袭中查找具有类或接口的资源”。

  • 增加了“flash messaging”叙述性文档章节。

  • 增加了一个标题为“防止跨站点请求伪造攻击”的叙述性章节。

  • 根据对“zodb+遍历wiki教程”的更改 pyramid_zodb 粘贴模板。

  • 增加了“高级配置”叙述章节,其中记录了如何处理配置冲突、两阶段配置, includecommit .

  • 修复的API文档呈现 pyramid.view.static

  • 添加“Pyramid提供了一种以上的方法来完成它”来设计防御文档。

  • 更改了“Static Assets”叙述章节:澄清 name 表示一个前缀,除非它是一个URL,为URL调度添加了一个根相对静态视图回退的示例,添加了一个创建返回文件正文的简单视图的示例。

  • 将Hook章节中的zcml用法移到声明性配置章节。

  • 将“Static Assets”一章合并为“资产”一章。

  • 在标题为“显示所有应用程序路由”(用于 paster proutes 命令)。

1.0A7(2010年12月20日)

术语更改

  • 以前被称为“模型”的Pyramid概念现在被称为“资源”。因此:

    • 已进行以下API更改:

      pyramid.url.model_url ->
                        pyramid.url.resource_url
      
      pyramid.traversal.find_model ->
                        pyramid.url.find_resource
      
      pyramid.traversal.model_path ->
                        pyramid.traversal.resource_path
      
      pyramid.traversal.model_path_tuple ->
                        pyramid.traversal.resource_path_tuple
      
      pyramid.traversal.ModelGraphTraverser ->
                        pyramid.traversal.ResourceTreeTraverser
      
      pyramid.config.Configurator.testing_models ->
                        pyramid.config.Configurator.testing_resources
      
      pyramid.testing.registerModels ->
                        pyramid.testing.registerResources
      
      pyramid.testing.DummyModel ->
                        pyramid.testing.DummyResource
      
    • 以前提到“模型”的所有文档现在都提到“资源”。

    • 这个 starterstarter_zcml 粘贴模板现在有一个 resources.py 模块而不是 models.py 模块。

    • 各种API的位置参数名称已从 modelresource .

    在所有情况下,向后兼容性垫片都保持在原位。他们将“永远”继续工作。

  • 以前被称为“资源”的Pyramid概念现在被称为“资产”。因此:

    • (非API)模块以前称为 pyramid.resource 现在被称为 pyramid.asset .

    • 以前提到“资源规格”的所有文档现在都提到“资产规格”。

    • 进行了以下API更改:

      pyramid.config.Configurator.absolute_resource_spec ->
                        pyramid.config.Configurator.absolute_asset_spec
      
      pyramid.config.Configurator.override_resource ->
                        pyramid.config.Configurator.override_asset
      
    • zcml指令以前称为 resource 现在被称为 asset .

    • 以前称为 BFG_RELOAD_RESOURCES (EnVaR)或 reload_resources (配置文件)现在分别称为 PYRAMID_RELOAD_ASSETSreload_assets .

    在所有情况下,向后兼容性垫片都保持在原位。他们将“永远”继续工作。

漏洞修补

  • 通过 nosetests 直接命令(而不是间接通过 python setup.py nosetests

  • 扫描过程中遇到配置冲突时,冲突异常现在显示导致冲突的装饰器信息。

特征

  • 补充 debug_routematch 记录匹配路由(包括matchdict和谓词)的配置设置。

  • 名字 registry 现在可在 pshell 默认环境。它是应用程序注册表对象。

环境

  • 所有环境变量的前缀 BFG_ 现在前缀为 PYRAMID_ (例如) BFG_DEBUG_NOTFOUND 现在是 PYRAMID_DEBUG_NOTFOUND

文档

  • 在URLDISPATCH叙述性文档章节中添加了“调试路由匹配”部分。

  • 添加了对的引用 PYRAMID_DEBUG_ROUTEMATCH 恩瓦尔和 debug_routematch “环境叙述文档”一章中的配置文件设置。

  • 略改“项目”章节,扩大对 paster pshell .

  • 将Jython用户引导至Mako,而不是“安装”叙述章节中的jinja2。

  • 许多变化支持术语更名“模型”为“资源”,“资源”为“资产”。

  • 添加了一个示例 WebTest 功能测试到测试叙述章节。

  • 按流行需求重新排列章节顺序(首先是URL调度,然后是遍历)。将混合动力章节放在视图章节之后。

  • 将“渲染者”从叙事文档的“视图”一章中分离出来,作为自己的一章。

贴纸模板

  • 补充 debug_routematch = false 所有贴纸模板。

依赖关系

  • 取决于金星>=0.5(用于扫描冲突异常装饰)。

1.0A6(2010年12月15日)

漏洞修补

  • 1.0A5在 pyramid.config.Configurator.scan 使用时没有 package 论证(例如) config.scan() 而不是 config.scan('packagename') . 其症状是:在控制台上打印了大量关于导入不推荐使用的Pyramid函数和类以及不检测带有 view_config 装饰工。这个问题已经解决了。

  • 测试现在在Windows上进行(没有发现错误,但测试套件中的一些测试假定文件名中存在Unix路径段)。

文档

  • 如果您按照它的要求,zodb+traversal wiki教程将指示您运行一个测试,该测试将失败,因为由 pyramid_zodb 教程使用了一个可以调用的单参数视图,但是示例代码中的测试使用了一个双参数调用。

  • 更新了所有步骤的zodb+traversal tutorial setup.py,以匹配 pyramid_zodb .

  • 修复对的引用 repoze.bfg.traversalwrapper 在“模型”一章中(指向 pyramid_traversalwrapper 相反)。

1.0A5(2010年12月14日)

特征

  • 添加 handler ZCML指令。此指令的作用与 pyramid.configuration.add_handler .

  • 名为 pyramid.config 加入。它包含了老年人的职责 pyramid.configuration 模块。

  • 新的 pyramid.config.Configurator` class has API methods that the older `` pyramid.configuration.configurator``类没有: ``with_context (一种分类方法) includeactioncommit . 这些方法的存在是为了强制应用程序扩展的目的。

  • 这个 pyramid.testing.setUp 函数现在接受 autocommit 关键字参数,默认为 True . 如果通过 False ,返回的配置对象 setUp 将是一个非自动提交配置对象。

  • 将日志配置添加到所有粘贴程序模板。

  • pyramid_alchemypyramid_routesalchemypylons_sqla Paster模板现在在各自的模板中使用惯用的SQLAlchemy配置 .ini 文件和python代码。

  • pyramid.testing.DummyRequest 现在有一个类变量, query_string ,默认为空字符串。

  • 通过捕获notimplementederor并从django.utils导入simplejson,添加对gae上JSON的支持。

  • Mako渲染器现在接受 mako.module_directory .

  • 新建布尔Mako设置变量 mako.strict_undefined . 见 Mako Context Variables 因为它的意义。

依赖关系

  • 取决于Mako 0.3.6+(我们现在需要 strict_undefined 特征)。

漏洞修补

  • 从中创建配置程序时, paster pshell 会话,要求您通过 package 尽管如此,参数 package 实际上不是必需的。如果你没有通过 package ,您将收到一个错误,类似 KeyError: '__name__' 源于 pyramid.path.caller_module 功能。现在已经修复了。

  • 这个 pyramid_routesalchemy 粘贴模板的单元测试失败 (AssertionError: 'SomeProject' != 'someproject' )这是固定的。

  • 使默认渲染器工作(渲染器工厂没有名称注册,除非视图指定特定的渲染器,否则对于每个视图都是活动的)。

  • Mako渲染器没有正确地旋转 mako.importsmako.default_filtersmako.imports 设置到列表中。

  • Mako渲染器没有正确转换 mako.error_handler 从点状名称设置为可调用名称。

文档

  • 从https://github.com/caseman/pyramid(直到并包括“模型”叙述章节)中合并了叙述性文档章节的许多措辞、可读性和正确性更改。

  • 文档的“示例应用程序”部分更改为注意从repoze.bfg原始包中移植的cluegun、shootout和virginia示例应用程序的存在。

  • sqlacalchemy+urldispatch教程更新以集成对 pyramid_routesalchemy 模板。

  • 添加 pyramid.interfaces.ITemplateRenderer 接口到接口API章节 implementation() 方法,获取变色龙宏时需要使用)。

  • 在项目叙述文档章节中添加“修改包结构”部分(解释如何将模块转换为包)。

  • 为新的 handler zcml部分中的zcml指令。

废弃

  • pyramid.configuration.Configurator 现已弃用。使用 pyramid.config.Configurator ,传递其构造函数 autocommit=True 相反。这个 pyramid.configuration.Configurator 别名的寿命将很长,因为每个应用程序都会使用它,但是它的导入现在会发出一个拒绝警告。这个 pyramid.config.Configurator 类的API与 pyramid.configuration.Configurator 类,它的意思是替换,但默认情况下它是 non-autocommitting 配置器。现在已弃用 pyramid.configuration.Configurator 将在每次调用配置方法时自动提交。

    这个 pyramid.configuration 模块仍保留,但已弃用。使用 pyramid.config 相反。

1.0A4(2010年11月21日)

特征

  • URL调度现在允许替换标记位于模式中的任何位置,而不是紧跟 / .

  • URL调度现在使用表单 {{marker}} 在路线图中表示替换标记,而不是 :marker . 为了向后兼容,仍然接受旧的冒号样式标记语法。新格式允许使用该标记位置的正则表达式,而不是默认的 [^/]+ ,例如 {{marker:\d+}} 现在有效,要求标记为数字。

  • 添加 pyramid.url.route_path API,允许人们生成相对的URL。打电话 route_path 和打电话一样吗 pyramid.url.route_url 有了参数 _app_url 等于空字符串。

  • 添加 pyramid.request.Request.route_path 应用程序编程接口。这是调用 pyramid.url.route_url .

  • 让测试套件通过Jython(需要PasteScript主干,大概是1.7.4)。

  • 让测试套件通过Pypy(变色龙不工作)。

  • 周围的应用程序配置 config.begin()config.end() 不再需要。所有的粘贴模板都已更改为不再调用这些函数。

  • 将配置程序固定为不转换 ImportErrorConfigurationError 如果失败的导入与解析点名称(如视图点名称)时通过点名称请求的导入无关。

文档

  • sqlacalchemy+urldispatch和zodb+遍历教程已更新为不调用 config.begin()config.end() .

漏洞修补

  • 将弃用警告添加到导入 pyramid.chameleon_textpyramid.chameleon_zpt 属于 get_rendererget_templaterender_templaterender_template_to_response .

  • 为导入添加弃用警告 pyramid.zcml.zcml_configurepyramid.zcml.file_configure .

  • 这个 pyramid_alchemy 粘贴模板有一个打字错误,导致导入无法工作。

  • 在调用时修复明显的故障 pyramid.traversal.find_model(root, path)pyramid.traversal.traverse(path) 什么时候? path 是(错误地)Unicode对象。用户应该将这些API作为字符串对象传递,而不是unicode对象。然而,实际上,用户确实通过了Unicode。因为传递的字符串必须是ASCII可编码的,现在,如果它们传递一个Unicode对象,它的数据将被热切地转换为一个ASCII字符串,而不是为了方便用户而被传递给下游代码,并防止出现令人费解的二阶故障(所有故障都将发生在 pyramid.traversal.traverse 而不是后来打电话的结果。 traversal_path

向后不兼容

  • 这个 pyramid.testing.zcml_configure API已被删除。自repoze.bfg 1.2a1以来,它被广告称为已被删除,但实际上并没有。

废弃

  • 这个 pyramid.settings.get_settings API现已弃用。使用 pyramid.threadlocals.get_current_registry().settings 或者使用 settings 请求中可用的注册表属性 (request.registry.settings

文档

  • 远离的 zodbsessions 教程章节。它仍然很有用,但是我们现在有了一个与之竞争的会话工厂抽象,并且在两种方法上维护文档会分散注意力。

内部的

  • 在内部集成测试中将twill替换为webtest(避免twill生成拒绝警告)。

1.0A3(2010年11月16日)

特征

  • 为添加了Mako TemplateLookup设置 mako.error_handlermako.default_filtersmako.imports .

  • 规范化的所有粘贴模板:现在每个模板都使用名称 main 为了表示返回wsgi应用程序的函数,现在每个应用程序都使用WebError,现在每个应用程序都有大致相同的development.ini样式。

  • 添加了类变量 matchdictmatched_routepyramid.request.Request . 每个设置为 None .

  • 新API方法: pyramid.settings.asbool .

  • 的新API方法 pyramid.request.Requestmodel_urlroute_urlstatic_url . 这些是它们各自在 pyramid.url .

  • 这个 settings 对象,以前只有在 request.settings.get_settings 已调用的现在可用为 registry.settings (例如) request.registry.settings 在视图代码中)。

漏洞修补

  • 塔架贴纸模板错误地使用了 {{squiggly}} 作为提供给的模式的路由语法 add_route . 不支持此样式的路由。它们被替换为 :colon 设计路线图案。

  • 挂架粘贴模板使用了相同的字符串 (your_app_secret_stringsession.secret 在生成的 development.ini . 如果在使用其中一个模板来生成生产应用程序的项目中保持不变,则这是一个安全风险。它现在使用随机生成的字符串。

文档

  • zodb+遍历wiki (wiki )由于更改,教程已更新 pyramid_zodb 粘贴模板。

  • sqlacalchemy+urldispach维基 (wiki2 )由于更改,教程已更新 pyramid_routesalchemy 粘贴模板。

  • 记录的 matchdictmatched_route 请求API文档中请求对象的属性。

废弃

  • 获得 settings 对象通孔 registry.{{get|query}}Utility(ISettings) 现已弃用。相反,获得 settings 对象通过 registry.settings 属性。向注册表对象添加了向后兼容性填充程序,以便在以下情况下将设置对象注册为ISettings实用程序 setattr(registry, 'settings', foo) 已调用,但将在以后的版本中删除。

  • 获得 settings 对象通孔 pyramid.settings.get_settings 现已弃用。把它作为 settings 立即获取注册表的属性(通过 pyramid.threadlocal.get_registry 或作为 request.registry

行为差异

  • 内部:zcml指令不再调用get_current_registry(),如果存在 registry zcml上下文上的属性(取消使用threadlocals)。

  • 内部:变色龙模板渲染器现在接受两个参数: pathlookup . Lookup 将是一个查找类的实例,该类为调试、重新加载和转换提供(后期绑定)参数。使用(非API)函数的任何第三方呈现器 pyramid.renderers.template_renderer_factory 需要调整它们的实现以遵守新的回调参数列表。这一变化是为了消除对线程局部变量的不当使用。

1.0A2(2010年11月9日)

文档

  • 按接口对事件的所有引用(例如 pyramid.interfaces.INewRequest )已更改为参考其具体等级(例如 pyramid.events.NewRequest )在有关订阅的文档中。

  • 应用程序对Pyramid的所有引用都已从mod-pyramid`更改为app-`pyramid。自定义角色设置已添加到 docs/conf.py 考虑到这一点。(内部)

1.0A1(2010年11月5日)

特征(从BFG 1.3开始的增量)

  • Mako模板渲染器支持模板查找和Mako模板内的资源规范格式。必须在Pyramid中使用绝对文件名才能避免此查找过程。

  • 添加 pyramid.httpexceptions 模块,它是 webob.exc 模块。

  • 直接内置支持Mako模板语言。

  • 存在新的配置器方法: add_handler . 这个方法添加了一个挂架样式的“视图处理程序”(在挂架1.0中,这种东西曾被称为“控制器”)。

  • 配置器的新参数: session_factory .

  • 配置器上的新方法: set_session_factory

  • 使用 request.session 现在,如果会话工厂已配置,则返回(类似字典的)会话对象。

  • 请求现在具有一个新属性: tmpl_context 为了塔架用户的利益。

  • 以前称为 pyramid.view.bfg_view 现在最正式的是 pyramid.view.view_config 在文档和粘贴模板中。进口 pyramid.view.bfg_view 然而,将继续“永远”地工作。

  • 中的新API方法 pyramid.sessionsigned_serializesigned_deserialize .

  • 新接口: pyramid.interfaces.IRendererInfo . 此类型的对象将传递给渲染器工厂构造函数(请参见“向后不兼容”)。

  • 新事件类型: pyramid.interfaces.IBeforeRender . 在调用渲染器之前(但在应用程序级渲染器全局工厂通过 pyramid.configurator.configuration.set_renderer_globals_factory 如果有的话,已经注入了自己的密钥)。应用程序现在可以订阅 IBeforeRender 事件类型,以便在将渲染器全局数据集传递给渲染器之前对其进行内省和修改。事件对象iself有一个类似字典的接口,可以用于此目的。例如::

    from repoze.events import subscriber
    from pyramid.interfaces import IRendererGlobalsEvent
    
    @subscriber(IRendererGlobalsEvent)
    def add_global(event):
        event['mykey'] = 'foo'
    

    如果订阅服务器尝试添加已存在于渲染器全局字典中的键,则 KeyError 提高了。这一限制是由于订户不能相对订购。所有订阅服务器和应用程序级全局工厂添加到渲染器全局字典的键集必须是唯一的。

  • 新类: pyramid.response.Response . 这是一个纯粹的表面 webob.Response (旧代码不需要更改就可以使用这个外观,它的存在主要是为了虚荣和文档生成的目的)。

  • 所有现有的粘贴模板(除了 zodb )现在使用“命令式”配置 (starterroutesalchemyalchemy

  • 名为 pyramid_starter_zcml 存在,它使用声明性配置。

文件(来自BFG 1.3的增量)

  • 增加了一个 pyramid.httpexceptions API文档章节。

  • 增加了一个 pyramid.session API文档章节。

  • 增加了一个 Session Objects 叙述性文件章节。

  • 为添加了API章节 pyramid.personality 模块。

  • 为添加了API章节 pyramid.response 模块。

  • 先前提到的所有文件 webob.Response 现在使用 pyramid.response.Response 相反。

  • 对文档进行了大修,以使用命令式配置,将声明性配置(ZCML)解释移动到单独的叙述章节中。 declarative.rst .

  • zodb wiki教程已更新,以考虑对 pyramid_zodb 粘贴模板。

  • SQL wiki教程已更新,以考虑对 pyramid_routesalchemy 粘贴模板。

向后不兼容(与BFG 1.3)

  • 不再有 IDebugLogger 注册为名称为的命名实用程序 repoze.bfg.debug .

  • 以前有个名字的记录器 repoze.bfg.debug 现在有了名字 pyramid.debug .

  • 已弃用的API pyramid.testing.registerViewPermission 已删除。

  • 已弃用的名为 pyramid.testing.registerRoutesMapper 已删除。

  • 已弃用的名为 pyramid.request.get_request 被移除。

  • 已弃用的名为 pyramid.security.Unauthorized 被移除。

  • 已弃用的名为 pyramid.view.view_execution_permitted 被移除。

  • 已弃用的名为 pyramid.view.NotFound 被移除。

  • 这个 bfgshell Paster命令现在命名为 pshell .

  • 所有内置金星装饰师的金星“类别”(例如 subscriber and view_config/bfg_view 现在 pyramid 而不是 bfg .

  • pyramid.renderers.rendered_response 功能已删除;使用 render_pyramid.renderers.render_to_response 相反。

  • 渲染器工厂现在接受 渲染器信息对象 而不是绝对资源规范或绝对路径。对象具有以下属性: name (the renderer= 价值) package (找到呈现程序配置语句时的“当前包”), type :渲染器类型, registry :当前注册表,以及 settings :部署设置字典。

    第三方 repoze.bfg 必须移植到Pyramid的渲染器实现需要考虑到这一点。

    此更改主要是为了支持更灵活的Mako模板呈现。

  • 钥匙的存在 repoze.bfg.message 在wsgi环境中,当发生异常时,现在不推荐使用。相反,依赖此环境值的代码应该使用 exception 请求的属性(例如 request.exception[0] )检索消息。

  • 价值观 bfg_localizerbfg_locale_name 在国际化期间为了缓存而保留在请求中的永远不是API。但是这些已经变成了 localizerlocale_name ,分别。

  • 默认值 cookie_name 价值观 authtktauthenticationpolicy zcml现在默认为 auth_tkt (过去它默认为 repoze.bfg.auth_tkt

  • 默认值 cookie_name 价值观 pyramid.authentication.AuthTktAuthenticationPolicy 构造函数现在默认为 auth_tkt (过去它默认为 repoze.bfg.auth_tkt

  • 这个 request_type 论据 view ZCML指令 pyramid.configuration.Configurator.add_view 方法,或 pyramid.view.view_config 装饰工 bfg_view )不再允许成为字符串之一 GETHEADPUTPOSTDELETE ,现在必须始终是接口。接受方法字符串为 request_type 是为repoze.bfg 1.0应用程序提供服务的向后兼容性策略。使用 request_method 参数来指定一个视图一个字符串请求方法谓词。

repoze.bfg 更改历史记录(Pyramid的前一个名称)

1.3b1(2010年10月25日)

特征

  • 这个 paster 模板命名 bfg_routesalchemy 已更新为使用SQLAlchemy声明性语法。感谢Ergo ^。

漏洞修补

  • 当找不到呈现器工厂时,如果呈现器名称不是字符串,则会引发错误消息。

文档

  • “bfgwiki2”(sqlacalchemy+url-dispatch)教程已稍微更新。特别是,源包不再尝试使用私有索引,推荐的Python版本现在是2.6。它还进行了更新,以考虑到 bfg_routesalchemy 用于设置环境的模板。

  • “bfgwiki”(zodb+traversal)教程已稍微更新。特别是,源包不再尝试使用私有索引,推荐的Python版本现在是2.6。

1.3A15(2010年9月30日)

特征

  • 这个 repoze.bfg.traversal.traversal_path API现在急切地尝试对Unicode进行编码 path 在尝试拆分和解码其段之前转换为ASCII。这是为了方便,有效地允许(存储为-unicode-in-a-database,或从-a-request-parameter检索为-as-unicode-from-a-request-parameter)将unicode路径传递给 find_model 最终在内部使用 traversal_path 在发动机罩下工作。在1.2及之前版本中,如果 path 是unicode,unicode在斜杠上被拆分,得到的每个段值都是unicode。不适当的呼叫 decode() 生成的Unicode路径段的方法可能导致 UnicodeDecodeError 即使路径的Unicode表示不包含“高阶”字符(实际上它执行了“双重解码”),也会发生这种情况。在我们尝试解码和拆分之前,通过将unicode路径参数转换为ascii,真正的错误将发生在一个更明显的地方,同时允许我们处理(为了方便)完全由ascii兼容字符构成的unicode表示。

1.3A14(2010年9月14日)

漏洞修补

  • 如果通过旧版注册了异常视图 set_notfound_viewset_forbidden_view API,发送到视图的上下文不正确(可能是 None 不适当)。

特征

  • 与Webob 1.0兼容。

要求

  • 现在需要Webob>=1.0。

向后不兼容

  • 由于Webob 1.0引入了更改,因此 repoze.bfg.request.make_request_ascii 事件订阅服务器不再工作,因此它已被删除。此订阅服务器用于部署,以便在bfg 0.7.0之前编写的代码可以不变地运行。此时,需要重写此类代码,以期望Unicode来自 request.GETrequest.POSTrequest.params 否则需要更换才能使用 request.str_POSTrequest.str_GET 和/或 request.str_params 而不是相同的非``str``版本,同一API的非``str``版本现在总是执行Unicode解码。

勘误表

  • 先前的changelog条目断言 INewResponse 如果响应“无效”(如果视图或呈现器返回的响应对象没有状态/标题/应用程序设计器),则不会向侦听器发送事件。这在这个版本中不是真的,在1.3A13中也不是真的。

1.3A13(2010年9月14日)

漏洞修补

  • 这个 traverse 路由谓词未能成功生成遍历路径。

特征

  • 为了方便配置“默认安全”的应用程序,添加了默认权限功能。如果提供了默认权限,则默认权限将用作所有视图注册的权限字符串,这些注册在其他情况下不会命名权限。这些API支持:

    • 向配置程序添加了一个新的构造函数参数: default_permission .

    • 配置程序中添加了一个新方法: set_default_permission .

    • 添加了一个新的zcml指令: default_permission .

  • 添加新的请求API: request.add_finished_callback . 完成的回调由路由器在请求处理的最后无条件地调用。有关更多信息,请参阅文档“Hook”叙述章节的“使用完成的回调”部分。

  • A request.matched_route 当路由匹配时,属性现在被添加到请求中。它的值是匹配的“route”对象(请参见 IRoute 内部接口 repoze.bfg.interfaces 路由对象的API的API文档)。

  • 这个 exception 为了“完成回调”和“响应回调”的好处,请求的属性现在设置得稍早一些,并且在一组稍有不同的场景中。在以前的版本中, exception 如果找不到异常视图,则根本没有设置请求的属性。在这个版本中, request.exception 当路由器捕获到异常时,即使找不到异常视图,也会立即设置属性。

  • 这个 add_route 配置器的方法现在接受 pregenerator 参数。结果路径的预产生器由调用 route_url 为了调整用户为特殊目的传递给它的参数集,例如塔架“子域”支持。它将影响由返回的URL route_url . 见 repoze.bfg.interfaces.IRoutePregenerator 接口以获取更多信息。

向后不兼容

  • 路由器不再设置值 wsgiorg.routing_args 路线匹配时进入环境。价值曾经是 ((), matchdict) . 这个功能只是在变更日志中被斜引用过;它从未被记录为API。

  • 这个 exception 请求的属性现在默认为 None . 在以前的版本中, request.exception 如果在请求处理期间用户代码未引发异常,则属性不存在;只有在找到异常视图后,该属性才开始存在。

废弃

  • 这个 repoze.bfg.interfaces.IWSGIApplicationCreatedEvent 事件接口已重命名为 repoze.bfg.interfaces.IApplicationCreated . 同样地, repoze.bfg.events.WSGIApplicationCreatedEvent 类已重命名为 repoze.bfg.events.ApplicationCreated . 旧的别名将无限期地继续工作。

  • 这个 repoze.bfg.interfaces.IAfterTraversal 事件接口已重命名为 repoze.bfg.interfaces.IContextFound . 同样地, repoze.bfg.events.AfterTraversal 类已重命名为 repoze.bfg.events.ContextFound . 旧的别名将无限期地继续工作。

  • 对wsgi环境值的引用 bfg.routes.matchdictbfg.routes.route 从文档中删除。这些将在内部保留几个版本,但它是 request.matchdictrequest.matched_route 现在是获取matchdict和导致匹配的路由对象的“官方”方法。

文档

  • 添加的文档 default_permission ZCML指令。

  • 添加的文档 default_permission 构造函数值和 set_default_permission 配置程序API文档中的方法。

  • 在“安全”章节中添加了一个名为“设置默认权限”的新章节。

  • 文件 renderer_globals_factoryrequest_factory 配置器构造函数的参数。

  • 在文档的“Hook”章节中添加了两个部分:“使用响应回调”和“使用完成的回调”。

  • 添加了 request.exception 属性 repoze.bfg.request.Request API文档。

  • 为“响应回调”和“完成回调”添加了词汇表条目。

  • “请求处理”叙述章节已更新,以记录完成和响应回调步骤。

  • 接口API文档中的新接口: IRoutePregenerator .

  • 在url分派叙述文档章节中添加了“匹配的路由”部分,详细介绍了 matched_route 属性。

1.3A12(2010年9月8日)

漏洞修补

  • 修复错误 repoze.bfg.url.static_url URL生成:如果使用两个资源规范来创建两个单独的静态视图,但它们共享一个公共前缀,则有可能 static_url 将生成错误的URL。

  • 在中修复另一个错误 repoze.bfg.static_url URL生成:生成的URL中的斜线太多。

  • 防止可能导致 RuntimeError 渲染尚未渲染一次的变色龙模板时。当多个人或线程试图同时执行同一视图时,这通常会在重新启动后直接发生:https://bugs.launchpad.net/karl3/+bug/621364

特征

  • 论点 repoze.bfg.configuration.Configurator.add_route 之前被称为 path 现在叫做 pattern 为了更好的解释。为了向后兼容,传递一个名为 pathadd_route 仍然可以无限期地工作。

  • 这个 path zcml的属性 route 指令现在命名为 pattern 为了更好的解释。老年人 path 属性将无限期地继续工作。

文档

  • 所有将路由模式称为 path 现在已更新,将它们作为 pattern .

  • 这个 repoze.bfg.interfaces API文档页面现在通过 repoze.sphinx.autointerface .

  • URL调度叙述章节现在指的是 interfaces 第章解释 IRoute 对象。

贴纸模板

  • 已更新RoutesAlchemy模板以使用 pattern 在其路由声明中而不是 path .

依赖关系

  • tests_require 现在包括 repoze.sphinx.autointerface 作为依赖。

内部的

  • 将API添加到 Configurator 已命名 get_routes_mapper . 这将返回一个实现 IRoutesMapper 接口。

  • 这个 repoze.bfg.urldispatch.RoutesMapper 对象现在有一个 get_route 返回单个路由对象的方法或 None .

  • 一种新的接口 repoze.bfg.interfaces.IRoute 加入。这个 repoze.bfg.urldispatch.Route 对象实现此接口。

  • 从路由对象访问路由模式的规范属性现在是 pattern 而不是 path .

  • 使用 hash() 而不是 id() 当计算自定义路由/视图谓词的“phash”时,为了允许自定义谓词对哪些谓词“相等”进行某种控制。

  • 使用 response.headerlist.append 而不是 response.headers.add 在里面 repoze.bfg.request.add_global_response_headers 如果响应不是WebOB响应。

  • 这个 repoze.bfg.urldispatch.Route 构造函数(不是API)现在接受不同的参数顺序。以前是 (pattern, name, factory=None, predicates=()) . 现在是 (name, pattern, factory=None, predicates=()) . 这是为了支持与 configurator.add_route .

  • 这个 repoze.bfg.urldispatch.RoutesMapper.connect 方法(不是API)现在接受不同的参数顺序。以前是 (pattern, name, factory=None, predicates=()) . 现在是 (name, pattern, factory=None, predicates=()) . 这是为了支持与 configurator.add_route .

1.3A11(2010年9月5日)

漏洞修补

  • 提前处理响应回调和newResponse事件,使响应的突变生效。

1.3A10(2010-09-05)

特征

  • 一个新的 repoze.bfg.request.Request.add_response_callback 已添加API。这种方法在新的 repoze.bfg.request API章。它可用于在创建具体的响应对象之前影响响应值。

  • 这个 repoze.bfg.interfaces.INewResponse 接口现在包括 request 因此,inewresponse的处理程序现在可以访问导致响应的请求。

  • 现在,配置器的以下每个方法都允许将以下命名参数作为“点式名称字符串”(例如“foo.bar.baz”)传递,而不是作为必须导入的实际实现对象传递:

    setup_registry

    根目录工厂、身份验证策略、授权策略、调试记录器、区域设置协商器、请求工厂、渲染器全局工厂

    add_subscriber

    用户,iface

    derive_view

    看法

    add_view

    视图, for_ ,上下文,请求类型,包含

    附加路由()

    视图,视图,工厂, for_ 视图上下文

    扫描

    add_renderer

    工厂

    set_forbidden_view

    看法

    set_notfound_view

    看法

    set_request_factory

    工厂

    设置“渲染器”全局“工厂”()

    工厂

    set_locale_negotiator

    谈判者

    testing_add_subscriber

    event_iface

漏洞修补

  • 在内部为本地“静态视图”注册的路由模式(通过 static ZCML指令或通过 add_static_view 配置程序的方法)不正确。它是为例如。 static*traverse ,而它应该已经注册 static/*traverse . 症状:当两个静态视图共享相同的路径前缀(例如 /static/static2

向后不兼容

  • 如果视图代码(或渲染器)返回的响应不是“真实”响应(例如,如果它不具有 .status.headerlist.app_iter ATT)

文档

  • 为添加API章节 repoze.bfg.request 模块,其中包括 repoze.bfg.request.Request 类(“请求对象”)。

  • 修改“请求和响应”叙述章节以引用新的 repoze.bfg.request API章。一些内容从本章移到了API文档本身。

  • 现在允许对配置器方法进行各种更改,以表示允许将python点状名称作为输入。

内部的

  • 使附加 global_response_headers 请求的属性(假定包含一系列的头键/值对,稍后将由路由器添加到响应中)已被删除。的功能 repoze.bfg.request.Request.add_response_callback 取代它。

  • 这个 repoze.bfg.events.NewResponse 类的构造已更改:现在必须使用 (request, response) 而不是简单的 (response) .

1.3A9(2010年8月22日)

特征

  • 配置程序现在接受一个点式名称。 一串 作为一个包 package 构造函数参数。这个 package 参数以前必须是包 对象 (不是虚线名称字符串)。

  • 这个 repoze.bfg.configuration.Configurator.with_package 方法已添加。此方法返回一个新的配置器,该配置器使用与其调用的配置器对象相同的应用程序注册表。新的配置器是用它的 package 构造函数参数设置为传递给的值 with_package . 这一特性将使未来的BFG版本更容易在当前只允许对象引用的地方允许虚线名称作为参数(然而,允许虚线名称而不是到处引用对象的工作尚未完成)。

  • 新的 repoze.bfg.configuration.Configurator.maybe_dotted 方法解析作为其 dotted 全局python对象的参数。如果无法解析该值,则 repoze.bfg.configuration.ConfigurationError 提高了。如果提供的值为 dotted 不是字符串,将无条件返回该值,而不尝试任何解析。

  • 新的 repoze.bfg.configuration.Configurator.absolute_resource_spec 方法将可能相对的“资源规范”字符串解析为绝对版本。如果提供的值为 relative_spec 不是字符串,将无条件返回该值,而不尝试任何解析。

向后不兼容

  • 中的函数 repoze.bfg.renderers 已命名 renderrender_to_response 在1.3A6中引入了一组 **values 要传递给呈现器的值的参数。这是错误的,因为渲染器不需要只接受字典(它们可以接受任何类型的对象)。现在,发送到渲染器的值必须作为名为 value . 这个 request 然而,参数仍然是关键字参数。

  • 中的函数 repoze.bfg.renderers 已命名 renderrender_to_response 现在接受一个名为 package .

  • 这个 get_renderer API在 repoze.bfg.renderers 现在接受 package 参数。

文档

  • ZCML include 指令文档不正确:它们指定了 filename 而不是(正确的) file 作为允许的属性。

内部的

  • 这个 repoze.bfg.resource.resolve_resource_spec 函数现在可以接受一个包对象作为它的 pname 参数而不仅仅是包名称。

  • 这个 _renderer_factory_from_name_renderer_from_name 删除了配置器的方法。这些都不是原料药。

  • 这个 _render_render_to_response_make_response 函数与 repoze.bfg.render (在1.3A6中添加)已移除。

  • 新助手类 repoze.bfg.renderers.RendererHelper 加入。

  • 地图视图功能 repoze.bfg.configuration 现在只接受渲染器名称参数,而不是同时使用 rendererrenderer _名称参数。它也需要一个 package 现在参数。

  • 使用 imp.get_suffixes 间接指向 repoze.bfg.path.package_name 而不是硬编码 .py .pyc.pyo 在试图决定某个目录是否为包时用于比较。

  • 使测试在Jython下再次运行(尽管它们目前并没有全部通过)。

  • reify修饰器现在维护它包装的函数的docstring。

1.3A8(2010年8月8日)

特征

  • 新公共接口: repoze.bfg.exceptions.IExceptionResponse . 此接口由所有内部异常类(例如 repoze.bfg.exceptions.NotFoundrepoze.bfg.exceptions.Forbidden )的实例都是异常对象,可以作为wsgi响应对象。这个接口是公开的,这样就可以配置同样是有效的wsgi响应工厂的异常类来实现它们,或者配置同样是异常实例的异常实例,或者配置响应实例来提供它们。

  • 新API类: repoze.bfg.view.AppendSlashNotFoundViewFactory .

    在任何视图中只能有一个未找到的视图 repoze.bfg 应用。即使你使用 repoze.bfg.view.append_slash_notfound_view 作为未找到的视图, repoze.bfg 仍然必须生成 404 Not Found 当无法重定向到斜线附加的URL时响应;此未找到的响应将对网站用户可见。

    如果您不关心这个404响应是什么样子的,并且您只需要重定向来斜杠附加的路由URL,那么您可以使用 repoze.bfg.view.append_slash_notfound_view 对象作为未找到视图。但是,如果您希望使用 习俗 当URL无法重定向到斜线附加的URL时,NotFound视图可调用,您可能希望使用 repoze.bfg.view.AppendSlashNotFoundViewFactory 类作为未找到视图,将NotFound视图作为其构造函数的第一个参数提供给它。例如::

    from repoze.bfg.exceptions import NotFound
    from repoze.bfg.view import AppendSlashNotFoundViewFactory
    
    def notfound_view(context, request):
        return HTTPNotFound('It aint there, stop trying!')
    
    custom_append_slash = AppendSlashNotFoundViewFactory(notfound_view)
    config.add_view(custom_append_slash, context=NotFound)
    

    这个 notfound_view 提供的必须遵循的两个参数视图可调用调用调用约定 (context, request) (context 将是异常对象)。

文档

  • 扩展了url分派叙述章节的“请求后清理”部分。

  • 扩展了url分派叙述章节的“重定向到斜线附加路由”部分。

内部的

  • 以前,在配置程序设置中注册了两个默认视图函数(一个用于 repoze.bfg.exceptions.NotFound 已命名 default_notfound_view 一个 repoze.bfg.exceptions.Forbidden 已命名 default_forbidden_view )以呈现内部异常响应。这些默认视图函数已被删除,替换为在配置程序设置中注册的常规默认视图函数。 repoze.bfg.interfaces.IExceptionResponse 只返回异常实例的接口; NotFoundForbidden 类现在仍然是异常工厂,但它们也是响应工厂,生成实现新的 repoze.bfg.interfaces.IExceptionResponse 接口。

1.3A7(2010年8月1日)

特征

  • 这个 repoze.bfg.configuration.Configurator.add_route API现在返回添加的路由对象。

  • A repoze.bfg.events.subscriber 添加了装饰器。这个修饰器修饰模块作用域函数,然后在执行scan()后将其视为事件侦听器。参见事件叙述文档章节和 repoze.bfg.events 有关更多信息,请参阅模块文档。

漏洞修补

  • 当为尚未存在的路由添加视图时(“尚未存在”是指临时添加视图,并为尚未通过添加路由添加的路由添加路由名称),该视图的值 custom_predicate 参数 add_view 迷路了。症状:当同时使用URL调度和自定义视图谓词时,错误的视图匹配。

  • A的模式匹配 :segment URL调度路由模式中的标记现在总是至少匹配一个字符。请参阅下面这个变更日志中的“向后不兼容”。

向后不兼容

  • 正则表达式中存在进行URL匹配的错误。例如,URL匹配机制将导致模式 /{{foo}} to match the root URL / resulting in a match dictionary of `` 'foo':u'或模式 ``/{{fud}}/edit might match the URL `` //edit``生成匹配字典 ``{{'fud':u''}} . 它的目的总是 :segment 模式中的标记需要匹配 至少一个 不匹配空字符串。然而,这意味着在某些情况下,应用程序无意中依赖的路由匹配可能不再发生。

文档

  • 添加了对 repoze.bfg.events.subscriber 装饰到事件叙述章节。

  • 补充 repoze.bfg.events.subscriber API文档 repoze.bfg.events API文档。

  • 在“设计防御”一章中添加了一个名为“zope 3”的部分,默认情况下强制执行“ttw”授权检查;bfg不执行。

1.3A6(2010年7月25日)

特征

  • 新论点 repoze.bfg.configuration.Configurator.add_route 以及 route ZCML指令: traverse . 如果你想 context 成为其他人 root 对象当此路由匹配时,可以将遍历模式拼写为 traverse 参数。此遍历模式将用作遍历路径:遍历将从该路由所隐含的根对象(全局根或由返回的对象)开始。 factory 与此路由关联)。

    的语法 traverse 论点与之相同 path . 例如,如果 path 提供的是 articles/:article/edittraverse 提供的参数为 /:article ,当一个请求出现,导致路由匹配时, article 匹配值为“1”(当请求URI为 /articles/1/edit )遍历路径将生成为 /1 . 这意味着根对象 __getitem__ 将用名称调用 1 在穿越阶段。如果 1 对象存在,它将成为 context 请求。遍历叙事有更多关于遍历的信息。

    如果遍历路径包含路径参数中不存在的段标记名,则会发生运行时错误。这个 traverse 模式不应包含不存在于 path .

    当匹配包含 *traverse 路径中的剩余标记。这个 traverse 参数允许您将路由模式与任意遍历路径关联,而不使用 *traverse 余数标记;相反,您可以使用其他匹配信息。

    请注意 traverse 当参数附加到具有 *traverse 路径中的剩余标记。

  • 一种新的方法 Configurator 存在: set_request_factory . 如果使用,此方法将设置 repoze.bfg 路由器创建所有请求对象。

  • 这个 Configurator 构造函数接受一个附加参数: request_factory . 如果使用,此参数将设置 repoze.bfg 路由器创建所有请求对象。

  • 这个 Configurator 构造函数接受一个附加参数: request_factory . 如果使用,此参数将设置 repoze.bfg 路由器创建所有请求对象。

  • 一种新的方法 Configurator 存在: set_renderer_globals_factory . 如果使用,此方法将设置 repoze.bfg 用于创建渲染器全局的路由器。

  • 一种新的方法 Configurator 存在: get_settings . 如果使用,此方法将返回当前设置对象(执行与 repoze.bfg.settings.get_settings API)。

  • 这个 Configurator 构造函数接受一个附加参数: renderer_globals_factory . 如果使用,此参数将设置 repoze.bfg 用于创建渲染器全局的路由器。

  • 添加 repoze.bfg.renderers.renderrepoze.bfg.renderers.render_to_responserepoze.bfg.renderers.get_renderer 功能。这些是必需的API,将使用与 renderer= 属性/参数以生成渲染器或渲染器。因为这些API为所有呈现提供了一个中心API,所以它们现在形成了执行强制模板呈现的首选方式。使用名为的函数 render_* 来自以下模块 repoze.bfg.chameleon_zptrepoze.bfg.chameleon_text 现在不鼓励(尽管不推荐)。支持旧模板系统特定API的代码现在调用新模板 repoze.bfg.renderer 代码。

  • 这个 repoze.bfg.configuration.Configurator.testing_add_template 已重命名为 testing_add_renderer . 使用旧名称提供向后兼容别名。

文档

  • 这个 Hybrid 叙述章节现在包含了 traverse 路由参数。

  • 这个 Hooks 叙述性章节现在包含有关更改请求工厂和添加渲染器全局工厂的部分。

  • API文档包括一个新模块: repoze.bfg.renderers .

  • 这个 Templates 章节已更新;所有在示例中使用模板化特定API来执行呈现的叙述(例如 repoze.bfg.chameleon_zpt.render_template_to_response 方法)改为使用 repoze.bfg.renderers.render_* 功能。

漏洞修补

  • 这个 header 谓词(用作视图谓词或路由谓词时)在使用名称/regex对指定时出现问题。当头在头字典中不存在时,可以馈送regex匹配项 None 使它抛出 TypeError: expected string or buffer 例外。现在,谓词按预期返回false。

废弃

  • 这个 repoze.bfg.renderers.rendered_response 函数从来不是一个官方的API,但可能是通过野外扩展导入的。它在这个版本中被正式否决。使用 repoze.bfg.renderers.render_to_response 相反。

  • 以下API是 文档 已弃用(意味着文档中已正式弃用它们,但在使用时不会引发弃用错误,并且可能会无限期地继续工作):

    repoze.bfg.chameleon_zpt 模块: get_rendererget_templaterender_templaterender_template_to_response . 建议的替代方案记录在这些方法的文档字符串中(文档中仍然存在这些方法)。

    repoze.bfg.chameleon_text 模块: get_rendererget_templaterender_templaterender_template_to_response . 建议的替代方案记录在这些方法的文档字符串中(文档中仍然存在这些方法)。

    通常,要执行与模板相关的函数,现在应该使用 repoze.bfg.renderers 模块。

向后不兼容

  • 新的内部异常类( not API) repoze.bfg.exceptions.PredicateMismatch 现在存在。当无法调用多视图的组成视图时(由于没有谓词匹配),当前会引发此异常。以前,在这种情况下, repoze.bfg.exceptions.NotFound 提高了。我们为预期的代码提供向后兼容性 NotFound 当没有谓词匹配时引发 repoze.bfg.exceptions.PredicateMismatch 继承 NotFound . 这将导致为注册的任何异常视图 NotFound 当谓词不匹配时调用,就像前面的行为一样。

    然而,有一个反常的情况会暴露出向后的不兼容性。如果1)您有一个注册为多视图成员的视图2)此视图显式地引发了 NotFound 例外 为了 继续执行多视图中的下一个谓词检查,该代码现在的行为将不同:与其跳到下一个视图匹配,不如将NotFound提升到顶级异常处理机制。使代码依赖于视图提升的行为 NotFound 如果继续进行下一个谓词匹配,将是一个悲剧,但并非不可能,因为 NotFound 是公共接口。 repoze.bfg.exceptions.PredicateMismatch 不是公共API,不能由应用程序代码依赖,因此不应将视图代码更改为引发 PredicateMismatch . 相反,移动引发 NotFound 将视图中的异常输出到自定义视图谓词中。

  • 如果在bfg 1.3下运行应用程序的单元测试套件时, KeyError 命名模板或 ValueError 如果指示“渲染器工厂”未注册,则可能会引发(例如 ValueError: No factory for renderer named '.pt' when looking up karl.views:templates/snippets.pt ,您可能需要在测试代码中执行一些额外的设置。

    最好的解决方案是使用 repoze.bfg.configuration.Configurator.testing_add_renderer (或者,也可以是被否决的 repoze.bfg.testing.registerTemplateRendererregisterDummyRenderer )包含每个单独单元测试套件的代码中的API,用于为被测代码使用的每个模板和呈现器注册一个“虚拟”呈现器。例如::

    config = Configurator()
    config.testing_add_renderer('karl.views:templates/snippets.pt')
    

    这将为此特定缺少的模板注册一个基本的虚拟渲染器。这个 testing_add_renderer 事实上的API 收益率 渲染器,但是如果你不关心渲染器是如何使用的,你也不关心它的引用。

    有一种更粗糙的方法来解决这个问题。它导致在测试系统时使用“真正的”模板实现,这是次优的,因为测试运行速度较慢,而单元测试实际上不会 be 单元测试,但更容易。始终确保您致电 setup_registry() 配置器的方法。如::

    reg = MyRegistry()
    config = Configurator(registry=reg)
    config.setup_registry()
    

    调用 setup_registry 只有当你 传球registry 配置器构造函数的参数。 setup_registry 如果不传入 registry .

    如果您的测试套件还没有使用配置器,并且仍在使用旧的 repoze.bfg.testing API名称 setUpcleanUp ,这些将代表您注册渲染器。

    此主题的症状存在一个变体:您可能已经为正在测试的代码使用的模板注册了一个虚拟模板或呈现器。 testing_register_rendererregisterTemplateRenderer ,但(可能您不知道)测试中的代码期望能够使用“真实”模板呈现器实现来检索或呈现 另一个 您忘记的模板被呈现为调用正在测试的代码的副作用。因为它发现了 real 模板,而系统以前正在测试,现在不能。解决方案是相同的。

    它还可以帮助减少使用 资源规格 指定测试套件和代码中的模板路径,而不是两者中的相对路径。资源规范是明确的,而相对路径需要相对于“here”,其中“here”并不总是定义得很好(测试套件中的“here”可能与测试代码中的“here”相同,也可能不同)。

1.3A5(2010年7月14日)

特征

  • 新的内部异常: repoze.bfg.exceptions.URLDecodeError . 此URL是名为 UnicodeDecodeError .

  • 当将URL段解码为Unicode失败时,引发的异常现在为 repoze.bfg.exceptions.URLDecodeError 而不是 UnicodeDecodeError . 这使得注册一个异常视图成为可能,当 repoze.bfg 无法解码URL。

漏洞修补

  • 修复回归 repoze.bfg.configuration.Configurator.add_static_view . 在1.3a4之前,包含斜线的视图名称被支持作为路由前缀。1.3A4通过尝试将它们作为完整的URL来打破这一点。

文档

  • 这个 repoze.bfg.exceptions.URLDecodeError 异常被添加到API文档的异常章节中。

向后不兼容

  • 在以前的版本中,当URL在遍历过程中无法从UTF-8解码时, TypeError 提高了。现在产生的错误是 repoze.bfg.exceptions.URLDecodeError .

1.3A4(2010年7月3日)

特征

  • 无证Hook:品牌 get_appget_rootrepoze.bfg.paster.BFGShellCommand 在端件可能干扰默认版本的情况下可挂起。

  • 在早期版本中,与URL调度路由相关联的自定义路由谓词(发送到 custom_predicates 的参数 repoze.bfg.configuration.Configurator.add_route )始终需要2位参数签名,例如 (context, request) . 在此版本之前, context 参数总是 None .

    在这个版本中,传递给谓词的第一个参数现在是一个常规命名的字典。 info 组成的 routematch . match 是一个字典:它表示路由在URL中匹配的参数。 route 表示匹配的路由的对象。

    当谓词需要访问路由匹配时,这很有用。例如::

    def any_of(segment_name, *args):
        def predicate(info, request):
            if info['match'][segment_name] in args:
                return True
        return predicate
    
    num_one_two_or_three = any_of('num, 'one', 'two', 'three')
    
    add_route('num', '/:num', custom_predicates=(num_one_two_or_three,))
    

    这个 route 对象是具有两个有用属性的对象: namepath . 这个 name 属性是路由名称。这个 path 属性是路由模式。在一组路由谓词中使用路由的示例:

    def twenty_ten(info, request):
        if info['route'].name in ('ymd', 'ym', 'y'):
            return info['match']['year'] == '2010'
    
    add_route('y', '/:year', custom_predicates=(twenty_ten,))
    add_route('ym', '/:year/:month', custom_predicates=(twenty_ten,))
    add_route('ymd', '/:year/:month:/day', custom_predicates=(twenty_ten,))
    
  • 这个 repoze.bfg.url.route_url API已更改。如果关键字 _app_url 在传递给的参数中存在 route_url ,此值将用作生成的URL的协议/hostname/port/leading path前缀。例如,使用 _app_url 属于 http://example.com:8080/foo 会导致URL http://example.com:8080/foo/fleeb/flub 如果与 route_name 扩展到 /fleeb/flub .

  • 现在可以使用URL作为 name 反馈参数 repoze.bfg.configuration.Configurator.add_static_view . 当name参数为url时, repoze.bfg.url.static_url API将生成将此URL(作为前缀)连接到包含静态文件名的路径。这使得将静态媒体放在单独的Web服务器上进行生产成为可能,同时保持静态媒体包在内部,并在开发期间由开发Web服务器提供服务。

文档

  • zodb wiki教程(docs/tutorials/bfgwiki)的授权章节已更改为通过组而不是直接用户名来演示授权(感谢alex marandon)。

  • sqlachemy wiki教程(docs/tutorials/bfgwiki2)的授权章节已更改为通过组而不是直接用户名来演示授权。

  • 将对教程源的请求重定向到https://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki/index.html以及https://docs.pylonsproject.org/projects/pyramid/en/latest/tutorials/wiki2/index.html分别。

  • 一个名为 Custom Route Predicates 添加到URL调度叙述章节。

  • 已更新“静态资源”一章,以提到使用 static_url 生成指向外部Web服务器的URL。

内部的

  • 远离的 repoze.bfg.static.StaticURLFactory 支持围绕(仍然是内部的)的新抽象 repoze.bfg.static.StaticURLInfo 助手类。

1.3A3(2010-05-01)

贴纸模板

  • 这个 bfg_alchemybfg_routesalchemy 模板不再注册 handle_teardown 调用的事件侦听器 DBSession.remove . 克里斯·威瑟斯发现这是不必要的。

文档

  • “bfgwiki2”(url dispatch wiki)教程代码和文档已更改,以删除 handle_teardown 调用的事件侦听器 DBSession.remove .

  • 有没有提到 handle_teardown 粘贴程序模板使用的事件侦听器已从URL分派叙述章节中删除。

  • 在i18n叙述文档章节中增加了一个标题为“检测可用语言”的部分。

1.3A2(2010年4月28日)

特征

  • 区域设置协商器不再需要显式注册。默认的区域设置协商器位于 repoze.bfg.i18n.default_locale_negotiator 现在无条件地用作…嗯,默认的区域设置协商器。

  • 默认的区域设置协商器变得更加复杂。

    • 首先,谈判代表寻找 _LOCALE_ 请求对象的属性(可能由视图或事件侦听器设置)。

    • 然后它寻找 request.params['_LOCALE_'] 价值。

    • 然后它寻找 request.cookies['_LOCALE_'] 价值。

向后不兼容

  • 默认的区域设置协商器现在查找名为 _LOCALE_ 而不是名为 locale 在里面 request.params .

行为改变

  • 现场谈判者现在可以回来了 None ,表示应使用默认区域设置。

文档

  • 更新了“国际化和本地化”一章中有关语言环境协商的文档。

  • i18n叙述章节文档的扩展部分,讨论如何使用gettext文件。

1.3A1(2010年4月26日)

特征

  • 添加了“异常视图”。当使用异常(从Python继承的任何内容)时 Exception builtin)作为视图上下文参数,例如:

    from repoze.bfg.view import bfg_view
    from repoze.bfg.exceptions import NotFound
    from webob.exc import HTTPNotFound
    
    @bfg_view(context=NotFound)
    def notfound_view(request):
        return HTTPNotFound()
    

    对于上述示例,当 repoze.bfg.exceptions.NotFound 任何视图或根工厂引发异常 notfound_view 将调用View Callable并返回其响应。

    其他普通视图谓词也可以与异常视图注册一起使用:

    from repoze.bfg.view import bfg_view
    from repoze.bfg.exceptions import NotFound
    from webob.exc import HTTPNotFound
    
    @bfg_view(context=NotFound, route_name='home')
    def notfound_view(request):
        return HTTPNotFound()
    

    上述异常视图将 route_name 属于 home ,表示只有匹配的路由的名称为时才会调用它。 home . 因此,对于系统中的任何给定异常,您都可以有多个异常视图:“最具体”的视图将在与视图注册匹配的一组请求情况时调用。唯一不能成功使用的谓词是 name . 用于查找异常视图的名称总是空字符串。

    针对继承自的对象注册的现有(1.3之前)普通视图 Exception 将继续工作。用于用户定义的异常和用作上下文的系统异常的异常视图也将起作用。

    该功能可用于任何视图注册机制。 (@bfg_view decorator、zcml或命令 config.add_view 风格)。

    这一特点是安德烈波普善意贡献。

  • 使用“金星” (https://docs.pylonsproject.org/projects/venusian/en/latest/ )表演 bfg_view 装饰扫描,而不是依赖于bfg内部装饰扫描仪。(事实上,金星只是bfg内部装饰扫描仪的一个推广)。

  • 国际化和本地化特性如“叙述性文档”一章所述,标题为 Internationalization and Localization .

  • 名为的新部署设置 default_locale_name 加入。如果此字符串作为粘贴程序存在 .ini 文件选项,它将被视为默认的区域设置名称。默认区域设置名称在与区域设置相关的操作(如语言翻译)期间使用。

  • 现在可以通过设置一个与bfg相关的贴纸器来为所有的变色龙bfg模板打开变色龙模板“调试模式”。 .ini 名为的文件设置 debug_templates . 变色龙模板在渲染失败时引发的异常有时没有什么帮助。 debug_templates 允许您配置应用程序开发环境,以便变色龙在模板编译和执行期间生成的异常将包含更有用的调试信息。在所有新项目中,默认情况下都启用此模式。

  • 添加名为的配置程序的新方法 derive_view 可用于从用户提供的函数、实例或类生成可调用的BFG视图。这对于希望包装由用户提供的可调用文件的外部框架和插件作者很有用,这些可调用文件遵循与对象相同的调用约定和响应约定,这些对象可以作为视图可调用文件直接提供给BFG。见 derive_view 方法在 repoze.bfg.configuration.Configurator 博士学位。

ZCML

  • 添加 translationdir 支持本地化的zcml指令。

  • 添加 localenegotiator 支持本地化的zcml指令。

废弃

  • 异常视图功能取代了 set_notfound_viewset_forbidden_view 方法 Configurator 以及 notfoundforbidden ZCML指令。这些方法和指令将在可预见的未来继续工作,但在文档中已弃用。

依赖关系

  • 新的安装时间依赖于 venusian 已添加分发。

  • 新的安装时间依赖于 translationstring 已添加分发。

  • 现在需要变色龙1.2.3或更高版本(国际化和每模板调试设置)。

内部的

  • 视图注册和查找现在使用三个“requires”参数而不是两个参数来完成,以适应异常视图的正交性。

  • 这个 repoze.bfg.interfaces.IForbiddenViewrepoze.bfg.interfaces.INotFoundView 接口被删除;它们不是API,并且随着异常视图的添加而变得残留。

  • 去除 repoze.bfg.compat.pkgutil_26.py 和导入别名 repoze.bfg.compat.walk_packages . 这些只是内部扫描机器需要的;金星人取代了内部扫描机器,因此不再需要这些。

文档

  • 异常视图文档已添加到 Hooks 叙述章节。

  • 标题为 Internationalization and Localization 加入。

  • “环境变量和 ini “文件设置”章节已更改:有关 default_locale_name 已添加设置。

  • 新的API章节 repoze.bfg.i18n 模块已添加。

  • 新的文档 translationdirlocalenegotiator 添加了ZCML指令。

  • 在“模板”一章中增加了一节,标题为“模板中更好的例外”,描述了设置的结果。 debug_templates = true .

贴纸模板

  • 所有粘贴模板现在创建一个 setup.cfg 其中包括与鼻测试和babel消息目录提取/编译相关的命令。

  • A default_locale_name = en 已将设置添加到每个现有的贴纸模板。

  • A debug_templates = true 已将设置添加到每个现有的贴纸模板。

许可

  • Edgewall(BSD)许可证作为部分代码添加到licenses.txt文件中。 repoze.bfg.i18n 源于Babel源。

1.2(2010年2月10日)

  • 1.2B6无变化。

1.2B6(2010-02-06)

向后不兼容

  • 移除的魔法特征 repoze.bfg.url.model_url 如果发现请求与路由匹配,则在模型的路径之前预先准备了一个完全扩展的urldispatch路由url。这项功能构思不周,并没有在所有场景中都起作用。

漏洞修补

  • 提供的更正确的转换 renderer 值到资源规格值(内部)。

1.2B5(2010-02-04)

漏洞修补

  • 1.2B4引入了一个bug,通过路由配置添加的视图将视图命名为可调用视图,并且 view_attr 破碎了。症状: MyViewClass is not callable__call__ 正在调用类的,而不是名为via的方法 view_attr .

  • 修正一个错误 renderer 论据 @bfg_view 提供包相关模板文件名的装饰器可能未正确解析。症状:不适当 Missing template resource 错误。

1.2B4(2010年2月3日)

文档

  • 更新gae教程以使用变色龙而不是jinja2(现在可以了)。

漏洞修补

  • 确保 secure authtktauthenticationpolicy构造函数的标志按文档所述执行(合并Daniel Holth的Fancy-cookies-2分支)。

特征

  • 添加 pathhttp_only AuthtktAuthenticationPolicy构造函数的选项(合并Daniel Holth的Fancy-cookies-2分支)。

向后不兼容

  • 去除 view_headerview_acceptview_xhrview_path_infoview_request_methodview_request_paramview_containment 来自的谓词参数 Configurator.add_route 参数列表。这些论点是推测性的。如果需要这些参数公开的特性,请使用 route_name 论据 add_view 方法。

  • 去除 view_headerview_acceptview_xhrview_path_infoview_request_methodview_request_paramview_containment 来自的谓词参数 route ZCML指令属性集。这些属性是推测性的。如果需要这些属性公开的功能,请使用 route_name 的属性 view ZCML指令。

依赖关系

  • 删除对的依赖项 sourcecodegen (不取决于变色龙1.1.1+)。

1.2b3(2010-01-24)

漏洞修补

  • 使用“混合模式”(Traversal和UrlDispatch)时,默认情况下查找与路由相关的视图,即使使用更具体的上下文进行了与路由无关的视图注册。默认设置是先查找具有更具体上下文的视图。使用新的 use_global_views 返回旧行为的路由定义的参数。

特征

  • 添加 use_global_views 参数 add_route 配置器的方法。当此参数为true时,为注册的视图 no 如果找不到与路由相关的更多特定视图,则将找到路由。

  • 添加 use_global_views ZCML属性 <route> 指令(见上文)。

内部的

  • 注册视图时,使用“requires”接口将视图适配器注册为 (request_type, context_type) 而不是 (context_type, request_type) . 这提供了更明智的查找,因为注册总是使用特定的请求接口进行,但注册可能不使用特定的上下文接口进行。通常,在创建多适配器时,您希望对所需的接口进行排序,以便更可能使用特定接口注册的元素在不太可能注册的元素之前进行排序。

1.2B2(2010-01-21)

漏洞修补

  • Configurator 传递的实例 zope.component.registry.Components 作为一个 registry 构造函数参数,将实例修复为具有我们期望的 repoze.bfg.registry.Registry 什么时候? setup_registry 被称为。这使得可以将全局zope组件注册表用作bfg应用程序注册表。

  • 使用webob 0.9.7.1时,会对名为 charset 在内部 repoze.bfg.request.Request . 现在BFG 要求 WebOB>=0.9.7,并添加了代码,以便此拒绝警告消失。

  • 修正了一个视图查找排序错误,其中一个三元组的谓词数量越多的视图首先注册(字面上是第一个,而不是“更早”),在视图查找过程中会丢失一个注册的谓词数量越少的视图。

  • 确保具有完全n个自定义谓词的视图总是在具有完全n个非自定义谓词的视图之前调用,因为视图配置中的其他所有谓词都是相等的。

文档

  • 更改zcml指令文档的呈现。

  • 添加一个叙述性文档章节:“在repoze.bfg中使用zope组件架构”。

依赖关系

  • 需要Webob>=0.9.7

1.2B1(2010-01-18)

漏洞修补

  • bfg_routesalchemybfg_alchemy 粘贴模板和 bfgwiki2 教程,通过注册一个 repoze.tm.after_end 回调而不是依赖 __del__ A方法 Cleanup 类添加到wsgi环境中。这个 __del__ 战略脆弱,在野外造成了问题。感谢丹尼尔·霍尔特的测试。

特征

  • 从PasteDeploy配置文件读取日志配置 loggerspaster bfgshell 被调用。

文档

  • 为准备出版书籍而进行的重大返工。

1.2A11(2010-01-05)

漏洞修补

  • 制作 paster bfgshellpaster create -t bfg_xxx Jython的工作(修复轻微的不相容性和治疗 __doc__ 在类层面)。

  • 更新了对的依赖项 WebOb 需要支持测试中使用的功能的版本。

特征

  • Jython兼容性(至少当repoze.bfg.jinja2用作模板引擎时;变色龙在Jython下不工作)。

  • 当找不到呈现器模板时,在回溯中显示模板资源规范的派生abspath。

  • 当由于平台不兼容而无法呈现变色龙模板时,显示原始回溯。

1.2A10(2010-01-04)

特征

  • 这个 Configurator.add_view 方法现在接受名为 context . 这是名为 for_ ;优先于 for_ ,但是 for_ 将继续得到“永远”的支持。

  • 这个 view zcml指令现在接受名为 context . 这是名为 for ;优先于 for ,但是 for 将继续得到“永远”的支持。

  • 这个 Configurator.add_route 方法现在接受名为 view_context . 这是名为 view_for ;优先于 view_for ,但是 view_for 将继续得到“永远”的支持。

  • 这个 route zcml指令现在接受名为 view_context . 这是名为 view_for ;优先于 view_for ,但是 view_for 将继续得到“永远”的支持。

文档和粘贴模板

  • Latex 渲染调整。

  • 的所有用途 Configurator.add_view 使用它的方法 for_ 参数现在使用 context 改为参数。

  • 的所有用途 Configurator.add_route 使用它的方法 view_for 参数现在使用 view_context 改为参数。

  • 的所有用途 view 使用其 for 属性现在使用 context 改为属性。

  • 的所有用途 route 使用其 view_for 属性现在使用 view_context 改为属性。

  • 添加一个(最小)教程,处理使用 repoze.catalog 在一个 repoze.bfg 应用。

文件许可

1.2A9(2009年12月27日)

文件许可

  • 这个 文档 (结果) make <html|latex|htmlhelp>docs 目录)在本版本中,现在是在Creative Commons Attribution非商业性非衍生作品3.0美国许可证下提供的,如https://creativecommons.org/licenses/by-nc-nd/3.0/us/. 这只是文档的许可证更改 repoze.bfg 软件将继续在https://web.archive.org/web/20190401024809/http://repoze.org/许可证.html(类似于BSD)。

文档

  • 在生成的索引中添加了手动索引项。

  • 记录以前存在的(但不是API) repoze.bfg.configuration.Configurator.setup_registry 方法作为 Configurator .

  • 修复各种文档代码块中的语法错误。

  • 创建了新的顶级文档部分:“ZCML指令”。本节包含详细的ZCML指令信息,其中一些信息已从各个叙述章节中删除。

  • 文档的 Latex 渲染已经得到了改进。

  • 添加了一个“前题”部分,其中包含作者、版权和许可信息。

1.2A8(2009年12月24日)

特征

  • 添加 **kw ARG到 Configurator.add_settings 应用程序编程接口。

  • 添加 hook_zcaunhook_zca 方法到 Configurator 应用程序编程接口。

  • 这个 repoze.bfg.testing.setUp 方法现在返回 Configurator 可用于在单元测试期间进行进一步配置的实例。

漏洞修补

  • 这个 json 呈现程序未能将响应内容类型设置为 application/json . 现在可以了,通过设置 request.response_content_type 除非已设置此属性。

  • 这个 string 呈现程序未能将响应内容类型设置为 text/plain . 现在可以了,通过设置 request.response_content_type 除非已设置此属性。

文档

  • 通过使用更好的Sphinx角色(如“class”、“func”、“meth”)来改进一般文档。这意味着在所有的叙述、教程和API文档元素中都有更多指向API文档的超链接。

  • 在各个地方添加了对强制配置的描述,这些描述只描述了zcml配置。

  • 各种教程的语法更新。

  • 增加了 repoze.bfg.authenticationrepoze.bfg.authorizationrepoze.bfg.interfaces API文档的模块。

废弃

  • 这个 repoze.bfg.testing.registerRoutesMapper API(在早期的1.2 alpha中添加)已被弃用。它的导入现在会生成一个弃用警告。

1.2A7(2009年12月20日)

特征

  • repoze.bfg.configuration.Configurator 类: testing_securitypolicytesting_modelstesting_add_subscribertesting_add_template repoze.bfg.testing API命名 registerDummySecurityPolicyregisterModelsregisterEventListenerregisterTemplateRenderer testing 命名的API名义上是不推荐使用的(尽管它们可能会永远存在,因为它们在野外大量使用)。

  • 向添加新的API repoze.bfg.configuration.Configurator 类: add_settings . 此API可用于添加“设置”(通过 repoze.bfg.settings.get_settings api)在最初设置配置器之后。这对于测试来说是最有用的。

  • 添加 custom_predicates 论据 Configurator add_view 方法 bfg_view 装饰器和zcml的属性列表 view 指令。如果 custom_predicates 如果指定,则它必须是谓词可调用项的序列(谓词可调用项接受两个参数: contextrequest 回报 TrueFalse )只有当所有自定义谓词都返回时,才会调用关联的视图可调用 True . 当没有现有的预定义谓词可用时,请使用一个或多个自定义谓词。预定义谓词和自定义谓词可以自由混合。

  • 添加 custom_predicates 论据 Configurator add_route 以及zcml的属性列表 route 指令。如果 custom_predicates 如果指定,则它必须是谓词可调用项的序列(谓词可调用项接受两个参数: contextrequest 回报 TrueFalse )只有当所有自定义谓词都返回时,才会调用关联的路由。 True ,否则路由匹配继续。注意这个值 context 将永远 None 传递到自定义路由谓词时。当没有现有的预定义谓词可用时,请使用一个或多个自定义谓词。预定义谓词和自定义谓词可以自由混合。

内部的

  • 移除 repoze.bfg.testing.registerTraverser 功能。此函数从来不是API。

文档

  • 文档中已弃用的大多数助手函数 repoze.bfg.testing 模块。这些助手函数可能不会很快被删除,也不会很快生成警告,因为它们在野外大量使用,但是在配置器的方法中存在等价的行为。

1.2A6(2009年12月18日)

特征

  • 这个 Configurator 对象现在有两个新方法: beginend . 这个 begin 方法应在任何“配置”开始之前(例如,在 add_view ,等。这个 end 方法应在所有“配置”完成后调用。

    以前,在进行必要的配置之前(1.1及之前),配置的开始和结束总是由加载ZCML文件的过程所暗示。当zcml加载发生时,包含请求和注册表的threadlocal数据结构在加载之前被修改,在加载之后被删除,确保需要的所有框架代码 get_current_registry 在ZCML加载期间,已满足要求。

    在命令式配置期间调用的一些API方法(例如 Configurator.add_view 当涉及渲染器时)以历史原因结束调用 get_current_registry . 但是,在1.2A5及以下版本中,配置程序没有提供任何允许人们确保 get_current_registry 返回正在使用的配置程序所暗示的注册表。 begin 现在就是为了这个目的。相反地, end 弹出线程本地堆栈,撤消 begin .

    我们将此边界明确化,以减少在不同情况下使用配置器时(例如,在单元测试和应用程序代码中,而不是在初始应用程序设置中)可能出现的混淆。

    为不调用的1.2A1-1.2A5编写的现有代码 beginend 继续以以前的方式工作。但是,建议将此代码更改为调用 beginend 以减少未来出现混乱的可能性。

  • 所有 paster 生成应用程序框架的模板现在可以使用 beginend 它们在各自的副本中使用的配置器方法 run.pytests.py .

文档

  • 所有使用 Configurator 对象进行应用程序设置和测试设置现在使用新的 beginend 配置器的方法。

漏洞修补

  • 当A repoze.bfg.exceptions.NotFound or repoze.bfg.exceptions.Forbidden class (as opposed to instance) was raised as an exception within a root factory (or route root factory), the exception would not be caught properly by the repoze.bfg. 路由器和它将向上传播到调用堆栈,而不是像预期那样呈现未找到的视图或禁止的视图。

  • 当强制添加用作呈现器的变色龙页面或文本模板时(通过 Configurator.add_view 或者一些衍生产品),他们太急切地试图查找 reload_templates 设置通过 get_settings ,表示它们始终以非自动重新加载模式(默认)注册。现在每个人都要等到 template 访问属性以查找值。

  • 添加与以前注册的路由同名的路由时,不会从映射器的路由列表中删除旧路由。症状:旧的注册路由将在路由查找期间使用(并且可能是匹配的),而不应该有机会使用它。

1.2A5(2009年12月10日)

特征

  • repoze.bfg.exceptions.NotFoundrepoze.bfg.exceptions.Forbidden 从自定义根工厂或 factory 对于一个路由,适当的响应现在被发送到请求的用户代理(分别是NotFound视图或Forbidden视图的结果)。当从根工厂中引发这些错误时, context 传递到未找到或禁止的视图将 None . 此外,请求将不会用 view_namesubpathcontext ,等。如果允许进行遍历,通常是这样。

内构件

  • 表示由 Configurator 现在可作为 repoze.bfg.exceptions.ConfigurationError .

文档

  • 通用文档更新,它在更多地方考虑了必要的配置,并更自由地使用术语表引用。

  • 删除在新的请求事件订阅服务器中更改请求类型的解释,因为其他谓词现在通常是完成此操作的更简单的方法。

  • 在文档中添加了“线程局部变量”叙述章节,并添加了一个API章节来记录 repoze.bfg.threadlocals 模块。

  • 在“观点”叙述性文件章节中增加了“特殊例外”一节,解释了募集资金的效果。 repoze.bfg.exceptions.NotFoundrepoze.bfg.exceptions.Forbidden 从视图内代码。

依赖关系

  • 新的依赖 twill 包已添加到 setup.py tests_require 参数(只有在 repoze.bfg setup.py testsetup.py nosetests 被调用)。

1.2A4(2009年12月7日)

特征

  • repoze.bfg.testing.DummyModel 现在接受一个新的构造函数关键字参数: __provides__ . 如果提供了此构造函数参数,则它应该是接口或接口元组。然后,生成的模型将提供这些接口(它们将通过 zope.interface.alsoProvides

漏洞修补

  • GAE手术失败,大概是因为 repoze.bfg.configuration 模块开始尝试导入 repoze.bfg.chameleon_zptrepoze.bfg.chameleon_text 模块,这些不能在非cpython平台上使用。它现在可以容忍这些模块的启动时导入失败,并且只在实际使用其中一个包中的模板时引发导入错误。

1.2A3(2009年12月2日)

漏洞修补

  • 这个 repoze.bfg.url.route_url 函数传递不当 _query 和/或 _anchor 的参数 mapper.generate 函数,导致放大。

  • 当两个视图以不同的方式注册时 for 接口或类,以及 for 注册的第一个视图是第二个视图的超类, repoze.bfg 视图机制会错误地将两个视图与相同的“多视图”关联起来。多视图是指具有 确切地 对于/request/viewname值相同,不考虑继承。症状:即使正确指定了一个 for_ 一个或两个视图配置的视图配置期间的接口/类。

向后不兼容

  • 这个 repoze.bfg.templating 模块已被删除;它在1.1中已被弃用,实际上从未包含任何API。

1.2A2(2009年11月29日)

漏洞修补

  • 此包的长描述(如pypi上所示)不是有效的restructuredtext,因此不可渲染。

  • 尝试使用HTTP方法名称字符串,例如 GET 作为一个 request_type 谓词参数在强制配置或装饰器中遇到时导致启动时失败(症状: Type Error: Required specification must be a specification )不过,现在这又起作用了 request_method 现在是将视图配置与HTTP请求方法关联的首选谓词参数。

文档

  • 修复了“启动”叙述性文档章节;它解释了应用程序构造函数的“旧方法”。

1.2A1(2009年11月28日)

特征

  • 强制配置模式。

    A repoze.bfg 应用程序现在可以作为单个python文件开始其生命。稍后,应用程序可能演变为包中的一组python文件。甚至在以后,它可能会开始使用其他配置功能,例如 ZCML . 但是,无论是使用包还是使用非必需的配置,都不需要创建一个简单的 repoze.bfg 应用程序不再。

    强制配置使 repoze.bfg 与“微框架”竞争,如 BottleTornado . repoze.bfg 它有许多微框架所缺少的功能,所以它有望成为“两全其美”的功能。

    最简单的可能 repoze.bfg 应用程序现在为:

    from webob import Response
    from wsgiref import simple_server
    from repoze.bfg.configuration import Configurator
    
    def hello_world(request):
        return Response('Hello world!')
    
    if __name__ == '__main__':
        config = Configurator()
        config.add_view(hello_world)
        app = config.make_wsgi_app()
        simple_server.make_server('', 8080, app).serve_forever()
    
  • 现在存在一个新类: repoze.bfg.configuration.Configurator . 这个类构成了在“强制”配置的应用程序和传统的声明性配置的应用程序之间共享机器的基础。

  • 这个 repoze.bfg.testing.setUp 函数现在接受三个额外的可选关键字参数: registryrequesthook_zca .

    如果 registry 论点不是 None ,参数将被视为设置为“当前注册表”的注册表(它将由 repoze.bfg.threadlocal.get_current_registry )在测试期间。如果 registry 论证是 None (默认值),将创建一个新的注册表并在测试期间使用。

    的值 request 参数用作“当前请求”(它将由 repoze.bfg.threadlocal.get_current_request )在测试期间;默认为 None .

    如果 hook_zcaTrue (默认),即 zope.component.getSiteManager 函数将被一个返回 registry (或默认创建的注册表,如果 registryNone )而不是由返回的注册表 zope.component.getGlobalSiteManager ,导致Zope组件体系结构API (getSiteManagergetAdaptergetUtility 等等)使用测试注册表而不是全局ZCA注册表。

  • 这个 repoze.bfg.testing.tearDown 函数现在接受 unhook_zca 参数。如果这个论点是 True (违约), zope.component.getSiteManager.reset() 将被调用。这将导致 zope.component.getSiteManager 函数作为全局ZCA注册表 zope.component.getGlobalSiteManager )再一次。

  • 这个 run.py 各种模块 repoze.bfg paster 模板现在使用 repoze.bfg.configuration.Configurator 类而不是(现在的遗留) repoze.bfg.router.make_app 函数生成一个wsgi应用程序。

文档

  • 文档现在在大多数示例中使用“仅请求”视图调用约定(而不是 context, request 公约)。这只是一个文档更改;该 context, request 公约也得到了支持和记录,并将“永远”。

  • repoze.bfg.configuration 已添加API文档。

  • 标题为“创造你的第一个 repoze.bfg 已添加“应用程序”。本章详细介绍了新的 repoze.bfg.configuration.Configurator 类,并演示简化的“强制模式”配置;执行 repoze.bfg 以前,应用程序配置非常困难。

  • 一个名为“配置、装饰和代码扫描”的叙述性文档章节,解释了zcml-与命令式-与基于装饰器的配置等效性。

  • “zcml hooks”一章已重命名为“hooks”;它记录了如何通过命令式配置和zcml来覆盖hooks。

  • 有关如何提供备用“响应工厂”的说明已从“Hook”一章中删除。这个特性可能在以后的版本中被删除(它现在仍然有效,只是没有文档记录)。

  • 在单元测试章节中添加一个标题为“测试设置和拆卸”的部分。

漏洞修补

  • ACL授权策略调试输出 debug_authorization 由于所传递的主体集的授权失败而拒绝执行视图时,控制台调试输出的打开程度不如拒绝执行视图时的清晰程度,因为所传递的主体集从未与沿袭中任何ACL中的任何ACE匹配。在这种情况下,我们报告 <default deny> 作为ace值和根acl或 <No ACL found on any object in model lineage> 如果没有找到ACL。

  • 当两个视图注册为同一视图时 accept 参数,但如果请求进入具有 Accept 接受的标题 任何一个 在由注册了谓词的一组视图定义的媒体类型中,一个或多或少“随机”的视图将“获胜”。现在,我们更加努力地使用与具有最具体的视图配置相关联的视图可调用 accept 参数。多亏了阿尔贝托·瓦弗德的一个初始补丁。

内构件

  • 路由映射器不再是根工厂包装器。现在路由器直接查询。

  • 这个 repoze.bfg.registry.make_registry Callable已被删除。

  • 这个 repoze.bfg.view.map_view Callable已被删除。

  • 这个 repoze.bfg.view.owrap_view Callable已被删除。

  • 这个 repoze.bfg.view.predicate_wrap Callable已被删除。

  • 这个 repoze.bfg.view.secure_view Callable已被删除。

  • 这个 repoze.bfg.view.authdebug_view Callable已被删除。

  • 这个 repoze.bfg.view.renderer_from_name Callable已被删除。使用 repoze.bfg.configuration.Configurator.renderer_from_name 相反(但仍然不是API)。

  • 这个 repoze.bfg.view.derive_view Callable已被删除。使用 repoze.bfg.configuration.Configurator.derive_view 相反(但仍然不是API)。

  • 这个 repoze.bfg.settings.get_options Callable已被删除。它的工作已被 repoze.bfg.settings.Settings 类构造函数。

  • 这个 repoze.bfg.view.requestonly 函数已移动到 repoze.bfg.configuration.requestonly .

  • 这个 repoze.bfg.view.rendered_response 函数已移动到 repoze.bfg.configuration.rendered_response .

  • 这个 repoze.bfg.view.decorate_view 函数已移动到 repoze.bfg.configuration.decorate_view .

  • 这个 repoze.bfg.view.MultiView 类已移动到 repoze.bfg.configuration.MultiView .

  • 这个 repoze.bfg.zcml.Uncacheable 类已被删除。

  • 这个 repoze.bfg.resource.resource_spec 函数已被删除。

  • 所有处理路径属性的zcml指令现在都使用 path ZCML上下文的方法,将相对名称解析为绝对名称(强制配置要求)。

  • 这个 repoze.bfg.scripting.get_root 当API将请求设置为threadlocal时,它现在使用的是“real”webob请求,而不是fakerequest。

  • 这个 repoze.bfg.traversal.traverse API现在在调用遍历器时使用“real”webob请求,而不是fakerequest。

  • 这个 repoze.bfg.request.FakeRequest 类已被删除。

  • zca线程本地API的大多数使用 getSiteManagergetUtilitygetAdaptergetMultiAdapter 线程本地API)已从核心中删除。相反,当需要线程局部时,核心使用 repoze.bfg.threadlocal.get_current_registry 获取注册表的API。

  • 名为的内部ilogger实用程序 repoze.bfg.debug 现在只是一个未命名的IDebugLogger实用程序。已为b/w compat注册旧名称的命名实用程序。

  • 这个 repoze.bfg.interfaces.ITemplateRendererFactory 接口已被删除;已不再使用。

  • 而不是依赖于 martian 包做代码扫描,我们现在只使用我们自己的扫描程序。

  • 我们现在不再依赖 repoze.zcml 包装;相反, repoze.bfg 包包含的实现 adaptersubscriberutility 指令。

  • 与下列功能有关:

    repoze.bfg.view.render_view

    repoze.bfg.view.render_view_to_iterable

    repoze.bfg.view.render_view_to_response

    repoze.bfg.view.append_slash_notfound_view

    repoze.bfg.view.default_notfound_view

    repoze.bfg.view.default_forbidden_view

    repoze.bfg.configuration.rendered_response

    repoze.bfg.security.has_permission

    repoze.bfg.security.authenticated_userid

    repoze.bfg.security.effective_principals

    repoze.bfg.security.view_execution_permitted

    repoze.bfg.security.remember

    repoze.bfg.security.forget

    repoze.bfg.url.route_url

    repoze.bfg.url.model_url

    repoze.bfg.url.static_url

    repoze.bfg.traversal.virtual_root

    现在,这些函数中的每一个都应该使用一个请求对象来调用,该对象具有 registry 表示当前 repoze.bfg 注册表。它们返回到从线程本地API获取注册表。

向后不兼容

  • 使用的单元测试 zope.testing.cleanup.cleanUp 为了将测试彼此隔离,现在可能由于测试之间缺乏隔离而开始失败。

    原因如下:在repoze.bfg 1.1及之前版本中,注册表由 repoze.bfg.threadlocal.get_current_registry 当没有其他注册表被推送到线程时,本地堆栈是 zope.component.globalregistry.base 全球注册(亦称 zope.component.getGlobalSiteManager() )然而,在repoze.bfg 1.2+中,在这种情况下返回的注册表是新的模块范围 repoze.bfg.registry.global_registry 对象。这个 zope.testing.cleanup.cleanUp 函数清除 zope.component.globalregistry.base 全局注册表无条件。但是,它不知道 repoze.bfg.registry.global_registry 对象,所以不清除它。

    如果您使用 zope.testing.cleanup.cleanUp 功能在 setUp 而不是使用单元测试套件中的测试用例(从1.1开始更正确) repoze.bfg.testing.setUp ,您将需要替换所有呼叫 zope.testing.cleanup.cleanUp 打电话到 repoze.bfg.testing.setUp .

    如果替换所有呼叫 zope.testing.cleanup.cleanUp 打电话到 repoze.bfg.testing.setUp 是不可行的,你可以把这段代码放在某个精确执行的地方。 oncenot 对于测试套件中的每个测试;在 `` __init__.py`` 你的包或包的 tests 分装将是一个合理的地方)::

    import zope.testing.cleanup
    from repoze.bfg.testing import setUp
    zope.testing.cleanup.addCleanUp(setUp)
    
  • 当在 repoze.bfg.threadlocal.manager 线程本地数据结构(当没有“当前请求”或我们不在 r.b.testing.setUp -有界单元测试) .get 方法返回包含 全球的 注册表。在以前的版本中,此函数返回了全局zope“base”注册表:结果 zope.component.getGlobalSiteManager ,它是 zope.component.registry.Component 类。然而,在此版本中,全局注册表返回 repoze.bfg.registry.Registry 类。此注册表实例始终可以导入为 repoze.bfg.registry.global_registry .

    实际上,这意味着当你打电话 repoze.bfg.threadlocal.get_current_registry 当没有要求或 setUp 有界单元测试有效,您将始终返回位于 repoze.bfg.registry.global_registry . 这也意味着 repoze.bfg API call get_current_registry 将使用此注册表。

    这一变化是因为 repoze.bfg 现在,期望它使用的注册表具有与的裸实例稍有不同的API。 zope.component.registry.Components .

  • 视图注册不再注册 repoze.bfg.interfaces.IViewPermission 适配器(框架不再检查它;从1.1开始,视图就负责提供自己的安全性)。

  • 这个 repoze.bfg.router.make_app Callable不再接受 authentication_policy 也不 authorization_policy 参数。此功能在1.0版中已被弃用,已被删除。

  • 模糊:配置视图的机器 request_type androute_name 将忽略 route_name 仅为所暗示的接口注册视图 request_type . 在不太可能的情况下,您试图同时使用这两个功能,症状可能是命名为 request_type 但在匹配路径时,未找到与路径相关的。现在,如果一个视图同时配置了 request_type 和A route_name ,引发错误。

  • 这个 route zcml指令现在不再接受 request_typeview_request_type 属性。这些属性实际上并没有以任何有用的方式工作(请参见上面的条目)。

  • 因为 repoze.bfg 包现在包含 adaptersubscriberutility zcml指令,它现在是一个错误 <include package="repoze.zcml" file="meta.zcml"/> 在a的zcml中 repoze.bfg 应用。如果您的zcml发生冲突,则会引发zcml冲突错误。这不应该是“正常”安装的问题;它始终是 repoze.bfg.includes zcml在过去包含这个文件;现在不包含。

  • 这个 repoze.bfg.testing.zcml_configure 已删除API。使用 Configurator.load_zcml API代替。

废弃

  • 这个 repoze.bfg.router.make_app 函数现在名义上已被弃用。它的导入和使用不会引发警告,也可能永远不会消失。但是,使用 repoze.bfg.configuration.Configurator 类现在是生成wsgi应用程序的首选方法。

    注意 make_app 电话 zope.component.getSiteManager.sethook( repoze.bfg.threadlocal.get_current_registry) 代表调用者挂接ZCA全局API查找,以实现向后兼容性。如果你不使用 make_app ,至少在应用程序使用ZCA全局API时,调用代码需要自己执行此调用。 (getSiteManagergetAdapter 等)。

依赖关系

  • 依赖于 martian 包已被删除(其功能在内部被替换)。

  • 依赖于 repoze.zcml 包已被删除(其功能在内部被替换)。

1.1.1(2009-11-21)

漏洞修补

  • “混合模式”应用程序(明确使用遍历的应用程序 之后 URL发送通过 <route> 包含的路径 *traverse 元素)在1.1-final和所有1.1 alpha和beta版本中被破坏。未注册的视图 route_name 路由阴影视图注册到 route_name 不适当。

1.1(2009年11月15日)

内构件

  • 从中删除死掉的iRouteRequirement接口 repoze.bfg.zcml 模块。

文档

  • 改进“扩展现有应用程序”叙述章节。

  • 在“防御设计”一章中增加更多章节。

1.1B4(2009年11月12日)

漏洞修补

  • 使用 alsoProvides 在urldispatch模块中,将接口附加到请求,而不是 directlyProvides 以避免干扰NewRequest事件处理程序中设置的接口。

文档

  • 将1.0.1和上一个changelog移到history.txt。

  • 添加示例到 repoze.bfg.url.model_url 文档字符串。

  • 在FrontPage文档中添加“防御BFG设计”章节。

模板

  • 去除 ez_setup.py 从所有的粘贴模板、示例和教程中导入 distribute 兼容性。文档已经解释了如何安装virtualenv(其中包括 setuptools 所以这些文件、导入和使用是多余的。

废弃

  • 这个 options 千瓦到 repoze.bfg.router.make_app 函数已弃用。取而代之的是关键字参数 settings . 这个 options 关键字继续工作,并且在检测到它时不会发出拒绝警告。但是,粘贴程序模板、代码示例和文档现在引用 settings 而不是 options . 这种变化/贬低主要是为了与 get_settings() API和文档中不同地方的“设置”讨论:我们希望在任何地方使用相同的名称来指代相同的东西。

1.1B3(2009-11-06)

特征

  • repoze.bfg.testing.registerRoutesMapper 增加了测试设施。此测试函数在注册表中为需要其存在的测试注册路由“mapper”对象。此功能记录在 repoze.bfg.testing API文档。

漏洞修补

  • 使用在通过调用的交互式IPython会话中输入的赋值的复合语句 paster bfgshell 不再无法正确地改变shell命名空间。例如,这组用于失败的语句:

    In [2]: def bar(x): return x
      ...:
    In [3]: list(bar(x) for x in 'abc')
    Out[3]: NameError: 'bar'
    

    在这个版本中, bar 找到了函数,正确的输出现在发送到控制台。多亏了丹尼尔·霍尔特。

  • 这个 bfgshell 命令无法正常运行;它仍然希望能够使用空的 environ 而不是请求对象。

向后不兼容

  • 这个 repoze.bfg.scripting.get_root 函数现在需要 request 对象作为其第二个参数,而不是 environ .

1.1B2(2009-11-02)

漏洞修补

  • 防止PYPI安装失败,原因是 easy_install 尝试太难猜出最好的粘贴版本。什么时候? easy_install 从pypi中提取,它读取来自不同页面的链接,以确定“更新的”版本。当它试图找到“粘贴”发行版时,它错误地选择了一个名为“Paste-Deploy-0.1”(注意破折号)的古老版本包的链接,并且不知何故认为它是“粘贴”的最新版本。它还以某种方式“有益地”决定从SVN中检出这个包的一个版本。我们将粘贴依赖项版本固定到大于1.7的版本以解决此问题。 easy_install 缺陷。

文档

  • 修复“混合”叙事章节:停止声称 <view> 提到路由名称的语句需要在 <route> 创建路由的语句。从1.1a1开始就没有这种情况。

  • “什么是新的?” repoze.bfg 1.1“添加到叙述性文件中的文件。

特征

  • 添加新的事件类型: repoze.bfg.events.AfterTraversal . 此类型的事件将在遍历完成后,但在调用任何视图代码之前发送。喜欢 repoze.bfg.events.NewRequest ,此事件将具有单个属性: request 表示当前请求。与的请求属性不同 repoze.bfg.events.NewRequest 但是,在AfterTraversal事件期间,请求对象将拥有由遍历器设置的属性,最显著的是 context ,这将是找到并调用视图时使用的上下文。界面 repoze.bfg.events.IAfterTraversal 可用于订阅事件。例如::

    <subscriber for="repoze.bfg.interfaces.IAfterTraversal"
                handler="my.app.handle_after_traverse"/>
    

    与任何框架事件一样,订阅服务器函数应该期望一个参数: event .

依赖关系

  • 而不是依赖 chameleon.corechameleon.zpt 单独分配,取决于马耳他的重新包装 Chameleon 分配(包括 chameleon.corechameleon.zpt

1.1B1(2009-11-01)

漏洞修补

  • 路由根工厂称为路由工厂,它是具有环境而不是请求的默认路由工厂。此错误的症状之一:使用 bfg_zodb 1.1a9中的粘贴模板无法正常工作。

  • 恢复原状 renderer 别名 view_renderer<route> ZCML指令(野生1.1a BW兼容)。

  • bfg_routesalchemy 贴纸模板:更改 <route> 声明:重命名 renderer 属性到 view_renderer .

  • 由返回的头值 authtktauthenticationpolicy rememberforget 方法的类型为 unicode . 这违反了wsgi规范,导致 TypeError 当这些头在 mod_wsgi .

  • 如果具有与根URL匹配的路由的bfg应用程序安装在阿拉巴马州modwsgi的路径下 WSGIScriptAlias /myapp /Users/chrism/projects/modwsgi/env/bfg.wsgi ,主路线(路径为 '/''' )路径不匹配 /myapp 被访问(仅当路径 /myapp/ 参观了)。现在修复了这个问题:如果urldispatch根工厂注意到路径“info”为空,它会在尝试匹配之前将其转换为一个斜杠。

文档

  • <route> 教程zcml中的声明,重命名 renderer 属性到 view_renderer (FWD COMPAT)。

  • 修复由1.1a9中断的各种教程 <route> 指令更改。

内部的

  • 处理遍历模块中的潜在circref。

1.1a9(2009年10月31日)

漏洞修补

  • request_param 在zcml上使用了谓词属性 view 如果任何两个相同的谓词视图组合了谓词值和 = 签名和一个不带(例如 a VS a=123

特征

  • 在早期版本的bfg中,“根工厂”(即 get_root 可调用传递给 make_app 或由 factory 路由的属性)是使用“裸机”wsgi环境调用的。在这个版本中,如果继续,它将用 request 对象。传递给工厂的请求对象以这样的方式实现类似字典的方法:期望传递给环境的现有根工厂代码将继续工作。

  • 这个 __call__ 插件“遍历器”实现(注册为 ITraverserITraverserFactory )现在将收到 请求 作为它的唯一论据 __call__ 方法。在以前的版本中,它通过了一个wsgi environ 对象。传递给工厂的请求对象以这样的方式实现类似字典的方法:期望传递给环境的现有遍历器代码将继续工作。

  • ZCML route 指令的属性 xhrrequest_methodpath_inforequest_paramheaderaccept 现在 路线 谓词而不是 view 谓语。如果在路由配置中指定了这些谓词中的一个或多个,则所有谓词都必须返回true,路由才能匹配请求。如果与路由关联的一个或多个路由谓词返回 False 在请求期间选中时,路由匹配失败,并尝试路由列表中的下一个匹配。这与以前的行为不同,以前的行为不存在路由谓词,所有谓词都被视为视图谓词,因为在这种情况下,没有尝试下一个路由。

文档

  • 对支持从传递请求而不是环境到根工厂和遍历器的更改的叙述和API文档进行了各种更改。

内部的

  • 该请求实现类似字典的方法,这些方法会改变并查询wsgi环境。这只是为了向后兼容根工厂,而根工厂希望 environ 而不是请求。

  • 这个 repoze.bfg.request.create_route_request_factory 返回请求工厂的函数被删除,而不是 repoze.bfg.request.route_request_interface 函数,返回接口。

  • 这个 repoze.bfg.request.Request 类,它是 webob.Request 现在定义自己的 __setattr____getattr____delattr__ 方法,重写默认的WebOB行为。默认WebOB行为将请求的属性存储在 self.environ['webob.adhoc_attrs'] ,并在 __getattr__ . 由于速度和“期望”的原因,这种行为是不可取的。现在的属性 request 存储在 request.__dict__ (正如您可能从没有重写这些方法的对象期望的那样)。

  • 路由器不再呼叫 repoze.bfg.traversal._traverse 它的工作是“内联”(速度)。

  • 颠倒路由器调用请求工厂和根工厂的顺序。现在首先调用请求工厂;结果请求被传递到根工厂。

  • 这个 repoze.bfg.request.request_factory 函数已被删除。它的功能不再需要了。

  • 当配置中提到路由时,包装默认根工厂的“路由根工厂”现在通过 zope.interface.directlyProvides . 这将取代(现在不存在)中的逻辑 repoze.bfg.request.request_factory 功能。

  • 这个 routeview zcml指令现在将接口注册为命名实用程序(从 repoze.bfg.request.route_request_interface )而不是请求工厂(现在丢失的 repoze.bfg.request.create_route_request_factory .

  • 这个 repoze.bfg.functional 模块已重命名为 repoze.bfg.compat .

向后不兼容

  • 显式恢复1.1a8中引入的功能:其中 root 在发出NewRequest事件之前作为请求的属性提供。这使得一些潜在的未来功能不可能实现,或者至少很难实现(例如将遍历和视图查找分组到单个适配器查找中)。

  • 这个 containmentattrrenderer 的属性 route zcml指令被删除。

1.1a8(2009年10月27日)

特征

  • 添加 path_info 查看配置谓词。

  • paster bfgshell 如果可以导入,现在支持ipython。感谢Daniel Holth最初的补丁。

  • 添加 repoze.bfg.testing.registerSettings API,见“repoze.bfg.testing”API章节。这允许注册通过 repoze.bfg.settings.get_settings() 用于单元测试。

  • 名字 root 现在稍早(在发出newrequest事件之前)作为请求的属性提供。 root 是应用程序“根工厂”的结果。

  • 补充 max_age 参数到 authtktauthenticationpolicy ZCML指令。如果设置了此值,它必须是一个整数,表示auth tkt cookie将生存的秒数。主要是,它的存在允许auth-tkt cookie跨浏览器会话生存。

漏洞修补

  • 修复“扫描”过程中遇到的错误(当 <scan ..> 指令用于1.1a7中介绍的zcml)。症状: AttributeError: object has no attribute __provides__ 在启动时引发。

  • 这个 reissue_time 论据 authtktauthenticationpolicy ZCML指令现在实际工作。当设置为整数值时,每当请求需要身份验证时,都会在响应中追加一个AuthTicket set cookie头,“现在”减去AuthTicket的时间戳大于 reissue_time 秒。

文档

  • 在叙述性文档中添加一章,标题为“请求和响应”,内容取自WebOB文档。

  • 在“视图”一章中调用zcml指令的谓词属性。

  • 修复路由文件 (_query 证明文件为 query_anchor 证明文件为 anchor

向后不兼容

  • 这个 authtkt 身份验证策略 remember 方法不再是荣誉 tokenuserdata 关键字参数。

内部的

  • 如何改变 bfg_view decorator用作类方法decorator时工作。在1.1a7中,“scan”指令实际上试图在启动时搜索扫描包中的每个类,调用 dir 针对每个找到的类,然后调用 getattr 根据发现的每件事 dir 看看是不是一种方法。这导致了一些奇怪的症状(例如 AttributeError: object has no attribute __provides__ ,通常只是个坏主意。现在,不是在启动时为方法搜索类,而是 bfg_view 用于填充方法类的修饰符本身 __dict__ 当它被用作方法修饰器时。这也需要一个令人讨厌的框架,但它比启动时的摸索行为稍微不那么讨厌。这本质上是一个回归到1.1a6“摸索”行为加上一些特殊的魔法使用 bfg_view decorator作为方法decorator bfg_view 类本身。

  • 路由器现在检查 global_response_headers 返回响应之前请求对象的属性。如果该值存在,则假定它是两个元组的序列,表示要附加到“normal”响应头的一组头。这个特征是内部的,而不是外部的,因为不清楚它是否会长期存在。它是为了支持 reissue_time Authtkt身份验证策略的功能。

  • 接口itraverserFactory现在只是itraverser的别名。

1.1a7(2009年10月18日)

特征

  • 不止一个 @bfg_view 装饰师现在可以堆放在任何数量的其他上面。每次调用装饰器都注册一个视图配置。例如,下面的decorator和函数组合将为同一个可调用视图注册两个视图配置:

    from repoze.bfg.view import bfg_view
    
    @bfg_view(name='edit')
    @bfg_view(name='change')
    def edit(context, request):
        pass
    

    这样就可以将多个视图配置与单个可调用的视图配置关联起来,而不需要任何zcml。

  • 这个 @bfg_view 现在可以对类方法使用decorator::

    from webob import Response
    from repoze.bfg.view import bfg_view
    
    class MyView(object):
        def __init__(self, context, request):
            self.context = context
            self.request = request
    
        @bfg_view(name='hello')
        def amethod(self):
            return Response('hello from %s!' % self.context)
    

    当对类方法使用bfg_视图修饰器时,将为 (它是一个“类视图”,其中“attr”恰好是它所附加到的方法的名称),因此它在其中定义的类必须有一个合适的构造函数:一个接受 context, request 或者只是 request .

文档

  • 补充 Changing the TraverserChanging How :mod:`repoze.bfg.url.model_url` Generates a URL 到文档的“Hook”叙述章节。

内部的

  • 去除 ez_setup.py 以及在 setup.py . 在新的世界中,根据virtualenv安装说明,人们将已经拥有安装工具或分发工具。

1.1A6(2009年10月15日)

特征

  • 添加 xhracceptheader 查看ZCML视图声明、ZCML路由声明的配置谓词,以及 bfg_view 装饰者。见 Views 叙述性文档一章了解关于这些谓词的更多信息。

  • 添加 setUptearDown 功能到 repoze.bfg.testing 模块。使用 setUp 在测试设置和 tearDown 在测试中,拆卸现在是执行组件注册表设置和拆卸的推荐方法。以前,建议使用一个名为 repoze.bfg.testing.cleanUp 在测试设置和下拉列表中调用。 repoze.bfg.testing.cleanUp 仍然存在(由于其广泛使用,将“永远”存在);它现在只是 repoze.bfg.testing.setUp 名义上被否决。

  • bfg组件注册表现在作为请求ie的一个属性在视图和事件订阅服务器代码中可用。 request.registry . 除了这个注释之外,这个事实目前是未记录的,因为bfg开发人员不需要在任何其他地方直接与注册表交互。

  • bfg组件注册表现在继承自 dict 也就是说,它可以作为一个简单的字典使用。 成分 通过例如 registerUtilityregisterAdapter 和dict成员相比,类似的api方法保存在完全独立的命名空间中,因此使用其组件api方法不会影响字典命名空间中的键和值。同样,尽管组件注册表“碰巧是”一个字典,但是使用了诸如 __setitem__ 不会影响对其进行的任何组件注册。换句话说,您通过例如 repoze.bfg.threadlocal.get_current_registryrequest.registry 碰巧是一个组件注册表和一个字典,但是使用它的组件注册表API不会影响通过它的字典API添加到它的数据,反之亦然。这是一个基于“marco”目标的向前兼容性移动。

  • 公开和记录 repoze.bfg.testing.zcml_configure 应用程序编程接口。此函数从zcml文件填充组件注册表,以进行测试。它记录在“单元和集成测试”一章中。

文档

  • 虚拟主机叙述文档章节更新了有关 mod_wsgi .

  • 将所有索引URL指向文本1.1索引(这个alpha循环可能会持续一段时间)。

  • 更新了各种教程测试模块以供使用 repoze.bfg.testing.setUprepoze.bfg.testing.tearDown 方法以鼓励这一点作为今后的最佳实践。

  • 在单元测试叙述性文档章节中增加了“创建集成测试”部分。因此,单元测试章节的名称现在是“单元和集成测试”。

向后不兼容

  • 进口 getSiteManagerget_registryrepoze.bfg.registry 不再支持。这些导入在repoze.bfg 1.0中被弃用。进口 getSiteManager 应该这样做 from zope.component import getSiteManager . 进口 get_registry 应该这样做 from repoze.bfg.threadlocal import get_current_registry . 这样做是为了防止循环导入依赖项。

  • 交替调用两者的代码基 zope.testing.cleanup.cleanUprepoze.bfg.testing.cleanUp (同等对待,互换使用)在单元测试的设置/拆卸中,由于缺乏测试隔离,将开始经历测试失败。“正确”机制是 repoze.bfg.testing.cleanUp (或 repoze.bfg.testing.setUprepoze.bfg.testing.tearDown )但是大量的遗留代码库将使用 zope.testing.cleanup.cleanUp 相反。我们支持 zope.testing.cleanup.cleanUp 但不能与 repoze.bfg.testing.cleanUp 在同一代码库中。您应该在单个代码库中使用一个或另一个测试清理函数,但不能同时使用这两个函数。

内部的

  • 创造新 repoze.bfg.configuration 承担之前由 repoze.bfg.registryrepoze.bfg.router 模块(避免循环导入依赖项)。

  • 结果 zope.component.getSiteManager 使用设置的单元测试中的功能 repoze.bfg.testing.cleanUprepoze.bfg.testing.setUp 将是 repoze.bfg.registry.Registry 而不是全球 zope.component.globalregistry.base 注册表。这也意味着线程本地zca api函数 getAdaptergetUtility 以及内部BFG机械(例如 model_urlroute_url )将在单元测试中查询此注册表。这是一个基于“marco”目标的向前兼容性移动。

  • 远离的 repoze.bfg.testing.addCleanUp 功能和相关模块范围全局。这从来不是API。

1.1a5(2009年10月10日)

文档

  • 更改“traversal+zodb”和“url dispatch+sqlacalchemy”wiki教程以使用新的to-1.1“渲染器”功能(从所有视图返回字典)。

  • 在“查看”步骤之后,将测试添加到“url dispatch+sqlacalchemy”教程中。

  • 在文档的“遍历”叙述章节中添加了模型图遍历图。

  • exceptions 添加了API章节,记录了新的 repoze.bfg.exceptions 模块。

  • 描述“仅请求”视图调用约定在urldispatch叙述性章节中,在这里它是最有用的。

  • 将解释BFG路由器操作的图表添加到“路由器”叙述章节。

特征

  • 添加新的 repoze.bfg.testing 应用程序编程接口: registerRoute ,用于注册路由以满足呼叫,例如 repoze.bfg.url.route_url 在单元测试中。

  • 这个 notfoundforbidden ZCML指令现在接受以下附加属性: attrrendererwrapper . 它们与ZCML上下文中的含义相同。 view 指令。

  • 像姜戈那样的行为 APPEND_SLASH=True 使用 repoze.bfg.view.append_slash_notfound_view 在应用程序中查看为“未找到”视图。如果此视图是“未找到”视图(表示找不到视图),并且在应用程序的配置中定义了任何路由,则 PATH_INFO 不是以斜线结尾,如果 PATH_INFO plus 斜线匹配任何路由的路径,执行HTTP重定向到斜线附加路径_info。注意这会 lose POST 数据信息(将其转换为GET),因此您不应该依赖于此来重定向POST请求。

  • 加快 repoze.bfg.location.lineage 略微。

  • 加快 repoze.bfg.encode.urlencode (NEE) repoze.bfg.url.urlencode )略微。

  • 加快 repoze.bfg.traversal.model_path .

  • 加快 repoze.bfg.traversal.model_path_tuple 略微。

  • 加快 repoze.bfg.traversal.traverse 略微。

  • 加快 repoze.bfg.url.model_url 略微。

  • 加快 repoze.bfg.url.route_url 略微。

  • 加快速度 repoze.bfg.traversal.ModelGraphTraverser:__call__ 略微。

  • 轻微加速 repoze.bfg.router.Router.__call__ .

  • 新的 repoze.bfg.exceptions 创建该模块的目的是存储以前通过各种模块喷洒的异常。

内部的

  • 移动 repoze.bfg.traversal._url_quote 进入之内 repoze.bfg.encode 作为 url_quote .

废弃

  • 进口 repoze.bfg.view.NotFound 被否决,赞成 repoze.bfg.exceptions.NotFound . 旧位置仍在运行,但会发出拒绝警告。

  • 进口 repoze.bfg.security.Unauthorized 被否决,赞成 repoze.bfg.exceptions.Forbidden . 旧位置仍在运行,但会发出拒绝警告。重命名 UnauthorizedForbidden 对异常的名称和在引发时调用的系统视图进行奇偶校验。

向后不兼容

  • 我们以前为 urllib.urlencode 函数命名 repoze.bfg.url.urlencode 它委托给stdlib函数,但在调用stdlib版本之前将所有unicode值封送到utf-8字符串。一个新的替代者现在住在 repoze.bfg.encode 替换不委托给stdlib。

    替换与stdlib实现和上一个实现不同 repoze.bfg.url URL实现 doseq 参数现在是一种诱骗:它总是在 doseq=True 以速度为目的的方式(这是唯一理智的行为)。

    旧的导入位置 (repoze.bfg.url.urlencode )仍然是函数,尚未弃用。

  • 在0.8a7中,实现对象所期望的返回值。 ITraverserFactory 已从值序列更改为包含键的字典 contextview_namesubpathtraversedvirtual_rootvirtual_root_pathroot . 到目前为止,返回序列的旧式遍历器仍在工作,但生成了一个反预测警告。在这个版本中,返回序列而不是字典的遍历器将不再工作。

1.1A4(2009年9月23日)

漏洞修补

  • 在64位Linux系统上,作为多视图成员的视图(带有谓词的视图顺序)没有按正确的顺序进行评估。症状:在配置中,有两个视图同名,但其中一个视图具有 request_method=POST 谓词和不带谓词的谓词都将无条件调用(即使请求是post请求)。多亏了塞巴斯蒂安·多奇,他提供了指出这一点的建筑机器人。

文档

  • 添加了说明如何使用的教程 repoze.session (基于zodb的会话)在zodb-based repoze.bfg应用程序中。

  • 添加了一个教程,解释了如何将zeo添加到基于zodb的 repoze.bfg 应用。

  • 添加了一个说明如何运行 repoze.bfg 申请 mod_wsgi . 请参见文档的教程部分中的“在mod_wsgi下运行repoze.bfg应用程序”。

特征

  • 添加 repoze.bfg.url.static_url 能够生成指向静态资源的URL的API <static> ZCML指令。有关详细信息,请参阅“视图”叙述章节标题为“生成静态资源URL”的部分。

  • 添加 string 渲染器。此呈现器将任何可调用视图的非响应返回值转换为字符串。它记录在“观点”叙述章节中。

  • 给予 route ZCML指令 view_attrview_renderer 参数(以1.1A3功能加速)。这些也可以拼写为 attrrenderer .

向后不兼容

  • 实现 IRenderer 接口(及) ITemplateRenderer`, which is a subclass of `` irender)现在必须接受额外的 system 论证中 __call__ 方法实现。系统(而不是视图)计算的值由系统在 system 参数,它始终是字典。字典中的键包括: view (返回值的视图对象), renderer_name (渲染器的模板名或简单名称), context (上下文对象传递给视图),以及 request (传递给视图的请求对象)。以前只有itemplaterenders接收到系统参数作为main中的元素 value 字典。

内部的

  • bfg_view 对已修改的声明进行扫描。这应该没有外部影响。

  • 速度:不要在configure.zcml中注册ITraverFactory;而是依赖于queryadapter和modelgraphtraverser的手动默认值。

  • 速度:不要在configure.zcml中注册IContextURL;而是依赖于QueryAdapter和TraversalContextURL的手动默认值。

  • HelloWorld基准测试的一般速度微改进:用使用“in”关键字的语句替换Try/Exceptions。

1.1A3(2009年9月16日)

文档

  • 文件中的“观点”叙述章节已被广泛更新,以讨论“渲染者”。

特征

  • A renderer 属性已添加到视图配置中,替换了以前的(1.1a2)版本 template 属性。“渲染器”是一个接受视图返回值并将其转换为字符串的对象。这包括但不限于模板化系统。

  • 名为 IRenderer 加入。现有接口, ITemplateRenderer 现在从这个新接口派生。这个接口是内部的。

  • 名为 IRendererFactory 加入。名为 ITemplateRendererFactory 现在从这个接口派生。这个接口是内部的。

  • 这个 view 的属性 view 如果zcml指令还具有 renderer 属性。当渲染器是模板渲染器并且在渲染时不需要将名称传递给模板时,这非常有用。

  • 一个新的zcml指令 renderer 已添加。它记录在文档的“视图”叙述章节中。

  • ZCML view 指令(以及相关的 bfg_view decorator)现在可以接受“wrapper”值。如果提供了“wrapper”值,则它是单独视图的值 name 属性。当视图 wrapper 属性被渲染,“内部”视图首先被正常渲染。然后将其主体作为“包装体”附加到请求,然后查找并呈现包装视图名称(使用 repoze.bfg.render_view_to_response ,通过了请求和上下文。假设包装器视图对 request.wrapped_body ,通常将其结构插入到其他呈现模板中。此功能使仅使用zcml或装饰器(而不是始终使用zpt metal和类似物将视图渲染包装在外部包装中)指定(可能嵌套)视图之间的“owrap”关系成为可能。

依赖关系

  • 当在python<2.6下使用时,bfg现在对 simplejson 包。

废弃

  • 这个 repoze.bfg.testing.registerDummyRenderer API已被弃用,取而代之的是 repoze.bfg.testing.registerTemplateRenderer . 弃用警告是 not 在进口时以原名称签发;它将“永久”存在;但其存在已从文件中删除。

  • 这个 repoze.bfg.templating.renderer_from_cache 函数已移动到 repoze.bfg.renderer.template_renderer_factory . 这从来不是一个API,但在野外发现了使用它的代码。在进口时,将对前者发出弃用警告。

向后不兼容

  • 这个 ITemplateRenderer 接口已更改。以前它的 __call__ 接受方法 **kw . 它现在接受一个名为 kw (修订:从1.1a4开始接受两个位置参数: valuesystem )这主要是一个内部变更,但是它在一个地方被暴露在API中:如果您已经使用了 repoze.bfg.testing.registerDummyRenderer API在您的测试中使用自定义的“renderer”参数和您自己的renderer实现,您需要更改该renderer实现以接受 kw 而不是 **kw 在其 __call__ 方法(修订:接受 valuesystem 从1.1a4起的位置参数)。

  • 这个 ITemplateRendererFactory 接口已更改。以前它的 __call__ 方法接受 auto_reload 关键字参数。现在它 __call__ 方法不接受关键字参数。渲染器现在自己负责确定自动重新加载的细节。这纯粹是一种内部变化。此接口从未是外部的。

  • 这个 template_renderer 1.1a2中引入的zcml指令已被删除。它已被替换为 renderer 指令。

  • 上一个版本(1.1a2)添加了名为 template . 在此版本中,属性已重命名为 renderer . 这意味着属性更通用:它现在不仅可以是模板名,还可以是任何渲染器名(ala json

  • 在上一个版本(1.1a2)中,如果系统没有关联 template 使用扩展名为“已知”的文件名查看配置值。在此版本中,必须使用 renderer 属性,该属性是以 .txt 扩展(例如) templates/foo.txt )使用变色龙文本渲染器。

1.1a2(2009年9月14日)

特征

  • ZCML view 指令(以及相关的 bfg_view decorator)现在可以接受“attr”值。如果提供了“attr”值,则认为它是在需要响应时要调用的视图对象的名为方法。这通常只适用于作为类或实例的视图(对于函数不太有用,因为函数通常没有除 __call__

  • ZCML view 指令(以及相关的 bfg_view decorator)现在可以接受“template”值。如果提供了“template”值,并且view callable返回字典,则关联的模板将与字典一起呈现为关键字参数。请参见名为“视图 template “在“视图”叙述文档一章中了解更多信息。

1.1a1(2009年9月6日)

漏洞修补

  • “测试”模块从bfg-alchemy-paster模板中删除;这些测试不起作用。

  • BugFix: discriminator 对于zcml,“route”指令不正确。可以注册两个发生冲突的路由,而不需要系统在启动时发出configurationconflictError。

特征

  • 功能添加:查看谓词。它们暴露在 request_methodrequest_paramcontainment zcml的属性 view 声明,或 @bfg_view 装饰者。视图谓词可用于为比以前更精确的环境参数集注册视图。例如,可以用相同的视图注册两个视图 name 用不同 request_param 属性。如果 request.params dict包含“foo”(request_param=“foo”),可以调用一个视图;如果它包含“bar”(request_param=“bar”),则可以调用另一个视图。 request_param 也可以将键/值对命名为ala foo=123 . 只有当 foo key在request.params dict中,其值为“123”。这个特殊的例子可以为不同的表单提交编写单独的视图函数。其他谓词, containmentrequest_method 工作相似。 containment 是一个视图谓词,仅当上下文的图形沿袭具有具有特定类或接口的对象时才匹配。 request_method 是一个视图谓词,当HTTP REQUEST_METHOD 等于某个字符串(例如“post”)。

  • 这个 @bfg_view decorator现在接受三个附加参数: request_methodrequest_paramcontainment . request_method 当您希望视图仅匹配具有特定HTTP的请求时使用 REQUEST_METHOD ;一个字符串,用于命名 REQUEST_METHOD 也可作为 request_type 为了向后兼容。 request_param 当您希望视图仅匹配包含特定 request.params 键(有值或无值)。 containment 当您想要匹配一个请求时使用,该请求的上下文在其图形沿袭中有一些类或接口。这些统称为“视图谓词”。

  • 这个 route ZCML指令获得荣誉 view_request_methodview_request_paramview_containment 属性,如果提供了相关视图,则将这些值传递给相关视图。另外, request_type 属性现在可以拼写为 view_request_typepermission 可以拼写为 view_permission . 以开头的任何属性 view_ 现在可以不用 view_ 前缀,所以 view_for 可以拼写为 for 现在,等等。这两种形式都记录在urldispatch叙述文档一章中。

  • 这个 request_param zcml view指令属性(及其 bfg_view decorator-cosin)现在可以同时指定键和值。例如, request_param="foo=123" 意味着foo键的值必须为 123 使视图“匹配”。

  • 允许 repoze.bfg.traversal.find_interface 使用类对象作为参数与 model 过去了。这意味着你现在可以 find_interface(model, SomeClass) 以及在世系中发现的第一个物体 SomeClass 作为其类(或找到的第一个对象 SomeClass 因为它的任何超类)都将被返回。

  • 补充 static zcml指令,它为在目录中提供文件的视图注册路由。有关更多信息,请参阅“视图”叙述性文档一章的“使用zcml指令提供静态资源”一节。

  • 这个 repoze.bfg.view.static 类现在接受一个字符串作为它的第一个参数(“根目录”),该参数表示包的相对名称,例如 somepackage:foo/bar/static . 现在,这是使用此类拼写包相对静态路径的首选机制。一 package_name 为向后兼容,保留了关键字参数。如果提供的话,它将得到尊重。

  • API repoze.bfg.testing.registerView 现在需要一个 permission 参数。用这个代替 repoze.bfg.testing.registerViewPermission .

  • 路由声明的顺序与ZCML中使用“路由名称”的视图声明的顺序不再重要。以前,还不可能在“视图”声明中使用ZCML(按顺序)中尚未定义的路由的路由名称。

  • bfg路由器现在可以捕获 repoze.bfg.security.Unauthorizedrepoze.bfg.view.NotFound 呈现视图时出现异常。当路由器捕捉到 Unauthorized ,返回已注册的禁止视图。当路由器捕捉到 NotFound ,返回已注册的NotFound视图。

内部的

  • 更改urldispatch内部:现在,路由对象是使用路径、名称和工厂来构建的,而不是使用名称、匹配器、生成器和工厂。

  • 将(非API)默认视图、默认禁止视图和默认未找到视图函数移动到 repoze.bfg.view 模块(从 repoze.bfg.router

  • 已从中删除ViewPermissionFactory repoze.bfg.security . 视图权限检查现在通过注册和查找ISecuredView来完成。

  • 这个 static ZCML指令现在在构造路由时使用自定义根工厂。

  • 界面 IRequestFactories 已从repoze.bfg.interfaces模块中删除。这个接口从来不是API。

  • 函数名为 named_request_factories 数据结构名为 DEFAULT_REQUEST_FACTORIES 已从中删除 repoze.bfg.request 模块。这些都不是原料药。

  • 这个 IViewPermissionFactory 接口已被删除。这从来不是API。

文档

  • “视图”叙述文档中的仅请求约定示例被破坏。

  • 修复了安全API文档中与遗忘和记忆相关的文档错误。

  • 固定文件 repoze.bfg.view.static (叙事中的) Views 章)。

废弃

  • API repoze.bfg.testing.registerViewPermission 已弃用。

向后不兼容

  • 界面 IPOSTRequestIGETRequestIPUTRequestIDELETERequestIHEADRequest 已从中删除 repoze.bfg.interfaces 模块。这些没有被记录为API Post-1.0。不要使用其中一个,而是使用 request_method zcml属性或 request_method bfg_view decorator参数包含http方法名(其中一个 GETPOSTHEADPUTDELETE )而不是这些接口中的一个,如果您是显式使用的话。在集合中传递字符串 (GETHEADPUTPOSTDELETE 作为一个 request_type 参数也会起作用。理由:BFG现在使用“视图谓词”来确定请求类型,而不是依赖于附加到请求对象的接口。

  • 未经zcml帮助而注册的视图 view 指令现在负责执行自己的授权检查。

  • 这个 registry_manager 可从“repoze.bfg.registry”导入的向后兼容性别名,由于repoze.bfg 0.9已被删除,已弃用。如果要在自己的调试脚本中使用注册表管理器,请使用“repoze.bfg.paster.get_app”和“repoze.bfg.scripting.get_root”API的组合。

  • 这个 INotFoundAppFactory 接口已被删除;自repoze.bfg 0.9以来已弃用。如果您的 configure.zcml ::

    <utility provides="repoze.bfg.interfaces.INotFoundAppFactory"
             component="helloworld.factories.notfound_app_factory"/>
    

    替换为如下内容:

    <notfound
        view="helloworld.views.notfound_view"/>
    

    有关详细信息,请参阅文档“Hook”一章中的“更改未找到视图”。

  • 这个 IUnauthorizedAppFactory 接口已被删除;自repoze.bfg 0.9以来已弃用。如果您的 configure.zcml ::

    <utility provides="repoze.bfg.interfaces.IUnauthorizedAppFactory"
             component="helloworld.factories.unauthorized_app_factory"/>
    

    替换为如下内容:

    <forbidden
        view="helloworld.views.forbidden_view"/>
    

    有关详细信息,请参阅文档的“Hook”一章中的“更改禁止的视图”。

  • ISecurityPolicy -已删除自repoze.bfg 0.9以来已弃用的基于安全策略。如果你有这样的东西在你的 configure.zcml ,它将不再工作::

    <utility
      provides="repoze.bfg.interfaces.ISecurityPolicy"
      factory="repoze.bfg.security.RemoteUserInheritingACLSecurityPolicy"
     />
    

    如果您的应用程序中存在如上所述的zcml,那么您将在启动时收到一个错误。而不是上面所说的,你需要像这样的东西:

    <remoteuserauthenticationpolicy/>
    <aclauthorizationpolicy/>
    

    这只是一个例子。有关配置安全策略的更多信息,请参阅repoze.bfg文档的“安全”一章。

  • 注册身份验证或授权策略的自定义zcml指令(ala“authtktauthenticationpolicy”或“aclauthorizationpolicy”)应在zcml指令中“急切地”注册策略,而不是从zcml操作中注册。如果在延迟的ZCML处理过程中,视图机器在组件注册表中找不到身份验证或授权策略,则视图安全性将无法按预期工作。

1.0.1(2009年7月22日)

  • 为添加了支持 has_resourceresource_isdirresource_listdir 到资源“overrideprovider”;这修复了一个bug,该bug的症状是,除非覆盖的原始目录中存在同名文件,否则无法覆盖资源目录中的文件。

  • 修复了文档错误,显示对来自 matchdict :它们存储为 Article ,而不是子项。

  • 修复了显示错误环境密钥的文档错误 matchdict 由匹配的路由生成。

  • 为Python 2.6、2.6.1和2.6.2中的一个bug添加了一个解决方法,该错误与试图从Paste的FileApp提供静态文件时mimetypes模块中的递归错误有关:python.org。症状:文件“/usr/lib/python2.6/mimetypes.py,第244行,在guess_type return guess_type(url,strict)RuntimeError:超出了最大递归深度。感谢Armin Ronacher发现了症状并指出了解决方法。

  • 根据反馈对教程进行少量编辑以提高准确性。

  • 已声明粘贴和粘贴部署依赖项。

1.0(2009年7月5日)

  • 重新测试并将一些内容添加到GAE教程中。

  • 编辑了“扩展”叙事文档章节。

  • 在遍历wiki教程的“定义模型”一章中添加了“删除数据库”部分。

  • 对叙述和教程进行拼写检查。

1.0B2(2009年7月3日)

  • remoteuserauthenticationpolicy zcml指令没有 environ_key 指令(与文档不匹配)。

  • 固定 configure_zcml 在Windows上检查filespec。以前,如果包括驱动器号的绝对文件系统路径作为 filename (或) configure_zcml 在选项中dict)to repoze.bfg.router.make_app ,它将被视为一个包:资源名称规范。

  • 修复bfgwiki(traversal+zodb)和bfgwiki2(urldispatch+sa)教程中的错误和导入错误。

  • 对所有tutorial setup.cfg文件使用bfgsite索引。

  • 完整的文档语法/样式/拼写审核。

1.0b1(2009年7月2日)

特征

  • 允许粘贴配置文件 (configure_zcml )值或环境变量 (BFG_CONFIGURE_ZCML )命名将用于引导应用程序的ZCML文件(可选的包相关文件)。以前,集成器不能影响使用哪个zcml文件来执行bootstrapping(只有原始应用程序开发人员可以这样做)。

文档

  • 在叙述性文档中添加了一个“资源”章节,解释了如何从另一个包重写一个包中的资源。

  • 在叙述性文档中添加了“扩展”一章,解释了如何使用另一个python包和zcml扩展或修改现有的bfg应用程序。

1.0A9(2009年7月1日)

特征

  • 使以“package-name:relative/path”的形式向API传递字符串成为可能,例如 render_templaterender_template_to_responseget_template . 有时调用者所在的包是一个直接的命名空间包,因此返回的模块对于从中导航是半无用的。通过这种方式,调用者可以控制从何处查找内容的水平和垂直方向。

1.0A8(2009年7月1日)

废弃

  • 贬低 authentication_policyauthorization_policy 论据 repoze.bfg.router.make_app . 相反,开发人员应该使用各种身份验证策略zcml指令 (repozewho1authenticationpolicyremoteuserauthenticationpolicyauthtktauthenticationpolicyaclauthorizationpolicy `授权策略指令,如“安全性”叙述性文档一章和wiki教程中所述。

特征

  • 添加三个配置身份验证策略的新ZCML指令:

    • repozewho1authenticationpolicy

    • remoteuserauthenticationpolicy

    • authtktauthenticationpolicy

  • 添加一个新的zcml指令,用于配置名为 aclauthorizationpolicy .

漏洞修补

  • 错误修复:当 repoze.bfg.resource.PackageOverrides 类已实例化,它所覆盖的包已具有 __loader__ 属性,它将在启动时失败,即使 __loader__ 属性是另一个PackageOverrides实例。我们现在替换任何 __loader__ 这也是PackageOverrides实例。症状: ConfigurationExecutionError: <type 'exceptions.TypeError'>: Package <module 'karl.views' from '/Users/chrism/projects/osi/bfgenv/src/karl/karl/views/__init__.pyc'> already has a __loader__ (probably a module in a zipped egg) .

1.0A7(2009年6月30日)

特征

  • 添加 reload_resources 配置文件设置(即 BFG_RELOAD_RESOURCES 环境变量)。如果设置为true,则在目录资源覆盖(尤其是当前模板)之间移动文件时,不需要重新启动服务器。

  • 添加 reload_all 配置文件设置(即 BFG_RELOAD_ALL 环境变量)这意味着 reload_resourcesreload_templates .

  • 这个 static 帮助程序视图类现在使用 PackageURLParser 为了允许使用 resource ZCML指令。这个 PackageURLParser 类已添加到(新) static bfg中的模块;它是 StaticURLParser 班在 paste.urlparser .

  • 这个 repoze.bfg.templating.renderer_from_cache 函数现在检查 reload_resources 设置;如果为真,则不注册模板呈现器(它不会将注册表用作模板呈现器缓存)。

文档

  • 添加 pkg_resources 到术语表。

  • 更新“环境”文档以注意 reload_resourcesreload_all .

  • 更新了 bfg_alchemy 包含两个视图的粘贴模板:根视图显示指向记录的链接列表;记录视图显示该对象的详细信息。

内部的

  • 注册itemplaterenderer时,使用冒号而不是制表符作为包名和relpath之间的分隔符,以形成“spec”。

  • 注册A repoze.bfg.resource.OverrideProvider 当使用<resource>指令(性能)时,作为pkg_资源提供者,仅用于已知具有覆盖(而不是全局覆盖)的模块。

1.0A6(2009年6月29日)

漏洞修补

  • 使用 caller_package 函数而不是 caller_module 函数在 templating 为了避免在资源重写(实际上与文档匹配)中命名调用者模块。

  • 使用同一模块的子目录中的模板、直接存储在另一模块中的模板或存储在另一模块的子目录中的模板(实际上与文档匹配),可以覆盖直接存储在模块中的模板。

1.0A5(2009年6月28日)

特征

  • 存在名为“resource”的新ZCML指令。此zcml指令允许您用同一个包或另一个包中的其他模板覆盖包中的变色龙模板(包含模板和单个模板文件的目录)。这允许您“伪造”视图对模板的使用,使其检索不同于通过调用的相对路径实际命名的模板 render_template_to_response('templates/mytemplate.pt') . 例如,可以通过执行以下操作覆盖模板文件:

    <resource
      to_override="some.package:templates/mytemplate.pt"
      override_with="another.package:othertemplates/anothertemplate.pt"
     />
    

    传递给“to-override”和“override-with”的字符串被命名为“规范”。规范中的冒号分隔符将包名与包相对目录名分隔开。冒号和以下相对路径是可选的。如果未指定,则重写将尝试解析从另一个包的目录到包中的每次查找。例如::

    <resource
      to_override="some.package"
      override_with="another.package"
     />
    

    包中的各个子目录也可以重写::

    <resource
      to_override="some.package:templates/"
      override_with="another.package:othertemplates/"
     />
    

    如果要用另一个目录重写一个目录,必须确保将斜杠附加到 to_override 规范和 override_with 规范。如果未能在指向目录的规范末尾附加斜线,将得到意外的结果。不能用文件规范重写目录规范,反之亦然(如果尝试,将发生启动错误)。

    不能用资源本身重写资源(如果尝试,将发生启动错误)。

    只有个人 资源可能被覆盖。重写将不会遍历重写包内的子包。这意味着,如果您想要同时覆盖这两个资源 some.package:templatessome.package.views:templates ,您需要注册两个覆盖。

    规范中的包名称可以以点开头,这意味着包与zcml文件所在的包相对。例如::

    <resource
      to_override=".subpackage:templates/"
      override_with="another.package:templates/"
     />
    

    相同的覆盖 to_overrides 规范可以在zcml中多次命名。各 override_with 路径将按照zcml中定义的顺序进行查询,形成覆盖搜索路径。

    资源重写实际上可以重写模板以外的资源。任何使用 pkg_resources get_resource_filenameget_resource_streamget_resource_string 当使用重写时,API将获取重写文件。但是,唯一使用 pkg_resources bfg中的api是模板化的东西,所以我们只在这里调用模板重写。

  • 使用 pkg_resources API用于定位模板文件名,而不是使用 os.path 模块。

  • 这个 repoze.bfg.templating 模块现在使用 pkg_resources 定位和注册模板文件,而不是使用绝对路径名。

1.0A4(2009年6月25日)

特征

  • 原因 :segment 在路由路径中匹配,以将Unicode解码的和URL去引号的值放入匹配值的matchdict中。以前,在matchdict中放置了一个非解码的非url引号字符串作为值。

  • 原因 *remainder 在路径中匹配以放置 元组 在matchdict字典中,为了能够为遍历路径提供unicode解码值和url双引号值。以前,在matchdict中放置了一个非解码的非url引号字符串作为值。

  • 添加可选 max_age 关键字值 remember 方法 repoze.bfg.authentication.AuthTktAuthenticationPolicy ;如果将此值传递给 remember ,生成的cookie将具有相应的最大期限值。

文档

  • 将有关路径模式匹配语法的信息添加到URL调度叙述性文档中。

漏洞修补

  • 制作 route_url 生成期间替换URL引用段。其余部分不引用。

1.0A3(2009年6月24日)

实施变更

  • repoze.bfg 不再依赖路由包来解释URL路径。所有已知存在 path 模式将继续与居住在 repoze.bfg.urldispatch . <route> 使用某些属性(不常见的属性)的zcml指令可能无法工作(请参见下面的“向后不兼容”)。

漏洞修补

  • model_url 当传递一个由于路由匹配而生成的请求时,调用 route.generate .

  • GAE上的bfg不起作用,因为在 threading.local (症状:“不支持初始化参数”)。感谢迈克尔·伯恩斯坦的错误报告。

文档

  • 在“混合应用”一章中添加了一个“角落案例”解释,解释在“错误”视图匹配时该做什么。

  • 使用 repoze.bfg.url.route_url 教程而不是路由中的API url_for 应用程序编程接口。

特征

  • 增加了 repoze.bfg.url.route_url 应用程序编程接口。此API允许您根据 <route> 声明。有关更多信息,请参阅url分派叙述章节和“repoze.bfg.url”模块API文档。

向后不兼容

  • 由于不使用路线,使用路线 url_for bfg应用程序中的API(正如之前的教程迭代所建议的那样)将不再有效。使用 repoze.bfg.url.route_url 方法。

  • 上的以下属性 <route> ZCML指令不再有效: encodingstaticfiltercondition_methodcondition_subdomaincondition_functionexplicitsubdomains . 这些都是路线的特点。

  • 这个 <route> zcml指令不再支持 <requirement> 次指令。这是一个路线功能。

1.0A2(2009年6月23日)

漏洞修补

  • 这个 bfg_routesalchemy 由于测试和视图签名不匹配,粘贴模板应用程序测试失败。

特征

  • 添加 view_for 属性 route ZCML指令。此属性应引用接口或类(所有 for 的属性 view ZCML指令)。

文档

  • 安装部分的条件文档(“如何安装Python解释器”)。

向后不兼容

  • 这个 callback 论证 repoze.bfg.authentication 名为的身份验证策略 RepozeWho1AuthenticationPolicyRemoteUserAuthenticationPolicyAuthTktAuthenticationPolicy 现在必须接受两个位置参数:每个参数接受的原始参数(userid或identity)加上第二个参数,即当前请求。抱歉,当没有“全局”数据库连接时,这是为查找组提供服务所必需的。

1.0A1(2009年6月22日)

特征

  • 添加了一个名为 notfound . 此zcml指令可用于命名当请求无法解析为可调用视图时应调用的视图。例如::

    <notfound
        view="helloworld.views.notfound_view"/>
    
  • 添加了一个名为 forbidden . 此zcml指令可用于命名应在找到请求的可调用视图时调用的视图,但由于授权失败而无法调用该视图。例如::

    <forbidden
        view="helloworld.views.forbidden_view"/>
    
  • 允许视图 任选地 定义为只接受请求对象的可调用文件,而不是同时接受上下文和请求(仍然有效,并且始终有效)。以下类型用作此样式中的视图:

    • 接受单个参数的函数 request ,例如:

      def aview(request):
          pass
      
    • 新旧风格的类 __init__ 接受的方法 self, request ,例如:

      def View(object):
          __init__(self, request):
             pass
      
    • 具有 __call__ 接受的方法 self, request ,例如:

      def AView(object):
          def __call__(self, request):
             pass
      view = AView()
      

    这很可能一直都是呼叫约定,就像请求一样 context 由于已经是一个属性,并且由于URL调度而调用了视图,所以在参数中使用上下文并不是很有用。这是我的梦想。

  • 缓存调用方包全局中的绝对路径 repoze.bfg.path 为了避免重复(昂贵)调用os.path.abspath。

  • 添加 reissue_timetimeout 参数到 repoze.bfg.authentication.AuthTktAuthenticationPolicy 构造函数。如果这些都通过了,那么cookie将每隔一段时间被重置一次(从相同的更改中提取到repoze.who,最近)。

  • 与路由路由匹配相关的matchdict在请求时可用作 matchdict 属性: request.matchdict . 如果没有匹配的路由,则此属性将为无。

  • 显示404个响应,稍微便宜一点 environ["PATH_INFO"] 在NotFound结果页上,而不是完整计算的URL上。

  • 将LRU缓存实现移动到单独的包中 (repoze.lru

  • 遍历和URL调度的概念已经统一。现在可以使用与遍历“根工厂”和以前称为urldispatch“上下文工厂”的工厂相同的工厂。

  • 当根工厂参数(作为第一个参数)传递给 repoze.bfg.router.make_appNone ,A 违约 使用根工厂。这是为了支持将路由用作“根查找器”;它取代了存在默认值的想法。 IRoutesContextFactory .

  • 这个 view ` ZCML声明和 repoze.bfg.view.bfg_view decorator现在接受一个额外的参数: route_name . 如果A route_name 已指定,它必须与以前定义的名称匹配 route 语句。如果指定了该视图,则仅当该路由在请求期间匹配时才调用该视图。

  • 现在可以执行遍历 之后 一条路线匹配。使用模式 *traverse 在一个 <route> path zcml中的属性,它匹配的路径余数将用作遍历路径。

  • 当任何路由定义匹配时,wsgi环境现在将包含一个键 bfg.routes.route (匹配的路由对象)和键 bfg.routes.matchdict (调用route.match的结果)。

废弃

  • 公用事业登记 repoze.bfg.interfaces.INotFoundViewrepoze.bfg.interfaces.IForbiddenView 现在已弃用。使用 notfoundforbidden ZCML指令(有关更多信息,请参阅“Hook”一章)。这样的注册将继续工作,但是NotFound和Forbidden指令会做“额外的工作”,以确保由该指令命名的可调用文件可以被路由器调用,即使它是一个类或只请求参数的视图。

移除

  • 这个 IRoutesContextIRoutesContextFactoryIContextNotFound 接口已从中删除 repoze.bfg.interfaces . 这些都不是原料药。

  • 这个 repoze.bfg.urldispatch.RoutesContextNotFoundrepoze.bfg.urldispatch.RoutesModelTraverserrepoze.bfg.urldispatch.RoutesContextURL 类被删除。这些也不是API。

向后不兼容

  • 感动了 repoze.bfg.push 模块,实现了 pushpage 装饰师,分成一个单独的分配, repoze.bfg.pushpage . 使用这个装饰器的应用程序应该在将该分布添加到安装需求之后继续工作。

  • 不再支持通过iRequestFactory实用程序注册更改默认请求工厂(以前记录在“Hook”章节的“更改请求工厂”部分中)。由于统一了遍历和URL调度,生成请求的步骤很复杂,因此任何人都不太可能正确地覆盖它。对于那些只想修饰或修改请求的用户,使用一个新的RequestEvent订户(请参阅文档中的事件一章)。

  • 这个 repoze.bfg.IRequestFactory 接口已删除。为什么要看上面的子弹。

  • 路由“context factures”(在zcml中拼写为route语句的factory参数)现在必须期望wsgi environ作为单个参数,而不是一组关键字参数。他们可以通过询问环境来获得匹配字典。 ['bfg.routes.matchdict'] . 这是同一组关键字,以前在bfg 0.9及以下版本中传递给urldispatch“context factures”。

  • 使用 @zope.component.adapter bfg视图函数上的装饰器不再工作。使用 @repoze.bfg.view.bfg_view decorator将函数(或类)标记为视图。

  • 在环境中找到匹配路由对象的名称已从中更改 bfg.routebfg.routes.route .

  • 找到根现在完成了 之前 在路由器中生成一个请求对象(并发送一个新的请求事件)(它以前是在之后执行的)。

  • 添加 *path_info 到路由不再更改使用URL调度匹配的请求的路径信息。此功能仅用于服务 repoze.bfg.wsgi.wsgiapp2 装修工做的不对;使用 *subpath 相反,现在。

  • 价值观 subpathtraversedvirtual_root_path 附加到请求对象的现在总是元组而不是列表(性能)。

漏洞修补

  • 这个 bfg_alchemy 管道中名为“repoze.tm”的粘贴程序模板,而不是“repoze.tm2”,导致启动失败。

  • 根据路由器模块的旧概念移动用于注册IAuthenticationPolicy/iforBiddenView/inotfoundView的BBB逻辑 make_app 函数转换为 repoze.bfg.zcml.zcml_configure 可调用,以服务与使用“zope.configuration.xmlconfig”的脚本的兼容性(替换为 repoze.bfg.zml.zcml_configure 必要时获取BBB逻辑)

文档

  • 将与如何创建身份验证策略和授权策略相关的接口文档添加到“安全”叙述章节。

  • 在叙述性文档中添加了一个(相当悲哀的)“结合遍历和URL调度”章节。这就解释了 *traverse*subpath 在路由URL模式中。

  • 增加了一个“路由器”章节,解释了高级别的请求/响应生命周期。

  • 用“根工厂”(已废弃上下文工厂)的等效解释替换了所有关于路由“上下文工厂”的提及和解释。

  • 更新了routes bfgwiki2教程,以反映上下文工厂现在不再使用的事实。

0.9.1(2009年6月2日)

特征

  • 添加API命名 repoze.bfg.settings.get_settings 它检索作为 options 价值 repoze.bfg.router.make_app . 应该首选此API,而不是使用getutility(isettings)。我添加了一个新的 repoze.bfg.settings API文档。

漏洞修补

  • 还原了在0.9中意外删除的bfg_alchemy paster模板缺少的入口点声明。

文档

  • 修复对的引用 wsgiappwsgiapp2 API文档 repoze.bfg.wsgi 模块。

API移除

  • 这个 repoze.bfg.location.locate API被删除了:它做的还不够有用,而且有一个误导性的名字。

0.9(2009年6月1日)

漏洞修补

  • 无法注册自定义 IRoutesContextFactory 作为默认上下文工厂使用,如“hooks”一章中所述。

特征

  • 这个 request_type zcml的参数 view 声明和 bfg_view 装饰器现在可以是字符串之一 GETPOSTPUTDELETEHEAD 而不是对从中导入的各个接口类型的引用 repoze.bfg.interfaces .

  • 这个 route zcml指令现在接受 request_type 作为它的别名 condition_method 对称性的论证 view 指令。

  • 这个 bfg_routesalchemy Paster模板现在提供了一个单元测试,并在视图呈现期间实际使用数据库。

移除

  • 去除 repoze.bfg.threadlocal.setManager . 它只在单元测试中使用。

  • 去除 repoze.bfg.wsgi.HTTPExceptionrepoze.bfg.wsgi.NotFoundrepoze.bfg.wsgi.Unauthorized . 这些课程由于引入了 IUnauthorizedViewINotFoundView 机械。

文档

  • 在叙述性模板章节中添加关于如何使用变色龙文本模板的说明。

  • 将视图叙述章节更改为使用方法字符串而不是接口类型,并将高级接口类型用法移动到事件叙述章节。

  • 添加了一个routes+sqlachemy wiki教程。

0.9A8(2009年5月31日)

特征

  • 现在可以注册自定义 repoze.bfg.interfaces.INotFoundView 对于给定的应用程序。此功能将替换 repoze.bfg.interfaces.INotFoundAppFactory 先前在“Hook”一章中介绍的功能。当框架检测到由于请求而完成的视图查找失败时,将调用InotfoundView;它应该接受上下文对象和请求对象;它应该返回一个IResponse对象(基本上是WebOB响应)。更多信息请参见BFG文档的Hooks叙述章节。

  • 路由器调用的视图返回非响应对象时出现的错误现在包括视图的名称,用于故障排除。

漏洞修补

  • 对于禁止和未找到的视图,将发出“新响应”事件。

废弃

  • 这个 repoze.bfg.interfaces.INotFoundAppFactory 接口已被弃用,取而代之的是使用 repoze.bfg.interfaces.INotFoundView

更名

  • 更名 repoze.bfg.interfaces.IForbiddenResponseFactoryrepoze.bfg.interfaces.IForbiddenView .

0.9A7(2009年5月30日)

特征

  • 从中删除“context”参数 effective_principalsauthenticated_userid 中的函数API repoze.bfg.security 有效地将“做”还原为0.8和“做”之前的行为。两个函数现在再次接受 request 参数。

0.9A6(2009年5月29日)

文档

  • 将“bfg wiki”教程更改为使用authtktauthenticationpolicy而不是repoze.who。

特征

  • 添加AuthtktAuthenticationPolicy。此策略从应用程序本身管理的身份验证cookie中检索凭据(而不是依赖上游数据源获取身份验证数据)。有关详细信息,请参阅文档的安全API章节。

  • 允许远程用户身份验证策略和repozewho1身份验证策略接受各种构造函数参数。有关详细信息,请参阅文档的安全API章节。

0.9A5(2009年5月28日)

特征

  • 添加 get_app API函数 paster 模块。这将从给定配置文件名和节名的配置文件中获取wsgi应用程序。见 repoze.bfg.paster 有关详细信息,请参阅API文档。

  • 添加名为的新模块 scripting . 它包含一个 get_root API函数,它提供了一个路由器实例,返回一个遍历根对象和一个“closer”。见 repoze.bfg.scripting 更多信息请参阅API文档。

0.9A4(2009年5月27日)

漏洞修补

  • 尝试检查“旧式”安全策略 之后 我们解析zcml(thinko)。

0.9A3(2009年5月27日)

特征

  • 允许通过zcml注册覆盖iauthenticationpolicy和iauthorizationpolicy(在router.py中注册后执行zcml分析)。

文档

  • 在文档中添加了“bfg wiki”教程;它描述了如何通过身份验证创建基于遍历的zodb应用程序。

废弃

  • 增加进口折旧 ACLSecurityPolicyInheritingACLSecurityPolicyRemoteUserACLSecurityPolicyRemoteUserInheritingACLSecurityPolicyWhoACLSecurityPolicyWhoInheritingACLSecurityPolicyrepoze.bfg.security 模块;同时(为了向后兼容目的),这些活动在 repoze.bfg.secpols 模块。但是请注意,“安全策略”的整个概念在bfg中已被弃用,取而代之的是单独的身份验证和授权策略,因此即使您开始使用 repoze.bfg.secpols . repoze.bfg.secpols 将在以后的版本中消失 repoze.bfg .

已弃用导入别名删除

  • 去除 repoze.bfg.template 模块。自0.3.8以来,此包中的所有导入都已弃用。相反,进口 get_templaterender_templaterender_template_to_responserepoze.bfg.chameleon_zpt 模块。

  • 删除的向后兼容性导入别名 repoze.bfg.traversal.split_path (自0.6.5起已弃用)。现在必须将此导入为 repoze.bfg.traversal.traversal_path

  • 删除的向后兼容性导入别名 repoze.bfg.urldispatch.RoutesContext (自0.6.5起已弃用)。现在必须将此导入为 repoze.bfg.urldispatch.DefaultRoutesContext .

  • 已删除的向后兼容性导入别名 repoze.bfg.router.get_optionsrepoze.bfg.router.Settings (自0.6.2起已弃用)。这两个都必须从 repoze.bfg.settings .

  • 已删除的向后兼容性导入别名 repoze.bfg.interfaces.IRootPolicy (自0.6.2起已弃用)。它必须作为 repoze.bfg.interfaces.IRootFactory 现在。

  • 已删除的向后兼容性导入别名 repoze.bfg.interfaces.ITemplate (自0.4.4起已弃用)。它必须作为 repoze.bfg.interfaces.ITemplateRenderer 现在。

  • 已删除的向后兼容性导入别名 repoze.bfg.interfaces.ITemplateFactory (自0.4.4起已弃用)。它必须作为 repoze.bfg.interfaces.ITemplateRendererFactory 现在。

  • 已删除的向后兼容性导入别名 repoze.bfg.chameleon_zpt.ZPTTemplateFactory (自0.4.4起已弃用)。这必须作为导入 repoze.bfg.ZPTTemplateRenderer 现在。

0.9A2(2009年5月27日)

特征

  • 添加了一个名为“bfgshell”的粘贴程序命令。此命令可用于获取全局命名空间中bfg根对象的交互式提示。例如。::

    bin/paster bfgshell /path/to/myapp.ini myapp
    

    Project 有关更多信息,请参阅BFG文档中的章节。

废弃

  • 名字 repoze.bfg.registry.registry_manager 不是API,但在野外的脚本使用它来设置一个环境,以便在调试shell下使用。为此添加了向后兼容填充程序,但该功能已被弃用。

0.9A1(2009年5月27日)

特征

  • 名为的新API函数 forgetremembersecurity 模块。这个 forget 函数返回头,当在响应中设置时,将导致当前已验证的用户注销。这个 remember 函数(传递正确的参数时)将返回头,这将导致在响应中设置主体时“登录”。有关更多信息,请参阅文档的安全API章节。

  • 新的关键字参数 repoze.bfg.router.make_app 已添加呼叫: authentication_policyauthorization_policy . 它们应该分别是身份验证策略的实现(实现 repoze.bfg.interfaces.IAuthenticationPolicy 接口)和授权策略的实现(对象实现 repoze.bfg.interfaces.IAuthorizationPolicy) . 身份验证策略的具体实现存在于 repoze.bfg.authentication . 授权策略的具体实现存在于 repoze.bfg.authorization .

    两个 authentication_policyauthorization_policy 默认为 None .

    如果 authentication_policyNone ,但是 authorization_policynot None 然后 authorization_policy 被忽略(进行授权的能力取决于身份验证)。

    如果 authentication_policy 论证是 not Noneauthorization_policy 论点 is None ,授权策略默认为使用ACL的授权实现。 (repoze.bfg.authorization.ACLAuthorizationPolicy

    我们不再像以前那样鼓励使用zcml配置“安全策略”。 ISecurityPolicy . 这是因为通常需要使用paste.ini参数配置具体授权或身份验证策略的设置;应用程序的应用程序入口点是执行此操作的自然位置。

  • 以系统使用的适配器的方式添加了两个新的抽象:一个 IAuthorizationPolicy 和一个 IAuthenticationPolicy . 它们的组合(由 securitypolicy ZCML指令)取代 ISecurityPolicy 以前版本repoze.who中的抽象。API在 repoze.who.security (如 authentication_userideffective_principalshas_permission ,等等)已被更改以尝试使用这些新适配器。如果你用的是老年人 ISecurityPolicy 适配器,系统仍然可以工作,但使用这种策略时,它将打印拒绝警告。

  • 通过zcml注册的(内部)iviewPermission实用程序的调用方式已更改。它们现在是纯粹的适配器,返回布尔结果,而不是返回可调用的。反正你不应该用这些。;-)

  • IAuthenticationPolicy的新具体实现已添加到 repoze.bfg.authentication 模块: RepozeWho1AuthenticationPolicy 其中使用 repoze.who 从和检索身份验证数据的标识 RemoteUserAuthenticationPolicy ,它使用 REMOTE_USER 用于检索身份验证数据的wsgi环境中的值。

  • IAuthorizationPolicy的新具体实施已添加到 repoze.bfg.authorization 模块: ACLAuthorizationPolicy 它使用acl继承来进行授权。

  • 现在可以注册自定义 repoze.bfg.interfaces.IForbiddenResponseFactory 对于给定的应用程序。此功能将替换 repoze.bfg.interfaces.IUnauthorizedAppFactory 先前在“Hook”一章中介绍的功能。当框架检测到授权失败时,将调用iforbiddenResponseFactory;它应该接受一个上下文对象和一个请求对象;它应该返回一个IResponse对象(基本上是一个Webob响应)。请阅读以下几点了解更多信息,并参阅BFG文档的Hooks叙述章节了解更多信息。

向后不兼容

  • 自定义未找到和禁止(nee'未经授权)的wsgi应用程序(注册为inotfoundappFactory和iunauthorizedappFactory的实用程序)可能依赖名为 message 描述响应的环境。此密钥已重命名为 repoze.bfg.message (根据wsgi规范,该规范要求环境扩展包含点)。

废弃

  • 这个 repoze.bfg.interfaces.IUnauthorizedAppFactory 接口已被弃用,取而代之的是使用 repoze.bfg.interfaces.IForbiddenResponseFactory

  • 这个 view_execution_permitted API现在应该从 repoze.bfg.security 模块而不是 repoze.bfg.view 模块。

  • 这个 authenticated_userideffective_principals 蜜蜂属 repoze.bfg.security 用于只接受一个参数(请求)。他们现在接受两个论点 (contextrequest )仍然支持使用单个参数调用它们,但会发出一个拒绝警告。(注:此更改在0.9A7中恢复;意味着这些函数的0.9版本再次接受 request 只有,就像0.8及之前的版本)。

  • 现在不赞成使用“老式”安全策略(那些基于ISecurityPolicy的策略)。有关激活授权策略和身份验证策略的信息,请参阅文档的“安全”章节。

0.8.1(2009-05-21)

特征

  • 类对象现在可以用作视图可调用文件(通过zcml和通过使用 bfg_view Python2.6中的decorator作为类decorator)。使用类作为视图可调用时的调用语义类似于使用类作为zope“浏览器视图”:类 __init__ 必须接受两个位置参数(常规命名 contextrequest )结果实例必须是可调用的(它必须具有 __call__ 方法)。调用时,实例应返回响应。例如::

     from webob import Response
    
     class MyView(object):
         def __init__(self, context, request):
             self.context = context
             self.request = request
    
         def __call__(self):
             return Response('hello from %s!' % self.context)
    
    See the "Views" chapter in the documentation and the
    ``repoze.bfg.view`` API documentation for more information.
    
  • 删除了zcml操作的酸洗(编写的代码 configure.zcml.cache 旁边 configure.zcml 项目中的文件)。当用户在命令(例如 @bfg_view )注册和声明性注册(例如 view zcml)中的指令。在一个中等大小的项目中(535个zcml操作和15个zcml文件),执行从pickle读取的操作只节省了大约200毫秒(2.5秒与平均2.7秒)。对于非常小的项目(1个zcml文件和4个操作),启动时间是可比的,有时从pickle读取时甚至会变慢,而且这两种方法都非常快,以至于它实际上并不重要。

0.8(2009年5月18日)

特征

  • 增加了一个 traverse 函数到 repoze.bfg.traversal 模块。此函数可用于检索路径解析期间计算的某些值。有关此函数的更多信息,请参阅文档的遍历API章节。

废弃

  • 内部: ITraverser Callables现在应该返回字典而不是元组。在0.7.0之前,假设所有iTravers返回3元组。在0.7.1中,假设iTravers返回6元组。根据证据,我们可能需要向可调用的itraverer的返回值添加更多信息,0.8假设itraverer返回一个包含某些元素的字典。见 repoze.bfg.interfaces.ITraverser 字典中应存在的键列表的接口。 ITraversers 哪一个返回元组仍然有效,尽管会发出一个拒绝警告。

向后不兼容

  • 如果您的代码直接使用itraverser接口(而不是通过API函数,例如 find_model )通过适配器查找,如果代码从默认的ModelGraphTraverser或RoutesModelTraverser适配器获取返回值,则需要更改代码以期望使用字典而不是3或6元组。

0.8A7(2009年5月16日)

向后不兼容

  • 这个 RoutesMapper 班在 repoze.bfg.urldispatch 已删除,以及其文档。从0.6.3开始就被弃用了。代码在 repoze.bfg.urldispatch.RoutesModelTraverser 它也被移除了。

  • 的语义 route zcml指令已简化。以前,假设要使用路由,需要将路由映射到外部注册的视图。新的 route 相反,指令具有 view 属性,指定可调用视图的点路径。当处理路由指令时,视图 注册的 使用route指令的name属性作为其名称,使用callable作为其值。这个 view_nameprovides 的属性 route 因此不再使用指令。实际上,如果您以前使用 route 指令,这意味着您必须更改一对如下所示的zcml指令:

    <route
       name="home"
       path=""
       view_name="login"
       factory=".models.root.Root"
     />
    
    <view
       for=".models.root.Root"
       name="login"
       view=".views.login_view"
     />
    

    到如下所示的zcml指令:

    <route
       name="home"
       path=""
       view=".views.login_view"
       factory=".models.root.Root"
     />
    

    换句话说,要使旧代码工作,请删除 view 仅为支持目的而存在的指令 route 指令,并移动它们 view= 属性到 route 指令本身。

    这一变化也要求 name 的属性 route 现在需要指令。如果你以前用过 route 没有的指令 name 属性,您需要添加一个(名称是任意的,但必须是唯一的 routeview 陈述)。

    这个 provides 的属性 route 指令也已被删除。该指令指定了一系列接口类型,生成的上下文将使用这些类型进行修饰。因为现在总是为单个接口生成路由视图 (repoze.bfg.IRoutesContext )与随意查找不同,不需要修饰任何上下文来确保找到视图。

文档

  • 为添加了API文档 repoze.bfg.testing 方法 registerAdapterregisterUtiityregisterSubscribercleanUp .

  • 为“根工厂”添加了术语表条目。

  • 注意到存在 repoze.bfg.pagetemplate 在叙述性文档的“模板”一章的“可用附加模板系统绑定”中进行模板绑定。

  • 更新文档中的“模板”叙述章节(展开以显示示例模板和正确的宏示例)。

特征

  • 有礼貌的卡洛斯·德·拉瓜迪亚补充道 alchemy 粘贴模板。这个粘贴器模板设置了一个使用sqalchemy(使用sqlite)的bfg项目,并使用遍历来解析URL。(不使用路线)。此模板可通过 paster create -t bfg_alchemy .

  • 路线 Route 用于解析匹配的对象现在作为 bfg.route 当使用URL调度时。

  • 现在可以全局更改默认路由“上下文工厂”。请参阅文档的“zcml hooks”一章(在“更改默认路由上下文工厂”一节中)。

0.8A6(2009-05-11)

特征

  • 增加了一个 routesalchemy 粘贴模板。这个粘贴器模板建立了一个bfg项目,该项目使用sqalchemy(使用sqlite),并专门使用路由来解析URL(不使用遍历根工厂)。此模板可通过 paster create -t bfg_routesalchemy .

文档

  • 向url调度章节添加了有关如何使用zcml捕获根url的文档 route 指令。

  • 在URL调度章节中添加了有关如何在请求结束时执行清理功能的文档(例如,关闭SQL连接)。

漏洞修补

  • 在0.6.3版中,通过 get_root 回调(根工厂) repoze.bfg.router.make_app 变为可选(如果有) route 声明是在ZCML中作出的。其目的是使完全废弃遍历成为可能,而完全依赖于URL调度(路由)来解析所有上下文。然而,一组复合的错误阻止了基于路由的根视图(一个响应“/”的视图)的使用。存在一个错误 repoze.bfg.urldispatch `另一个存在于路线本身。

    为了解决这个问题,修复了ulldispatch模块,并将一个分叉的路由主干放入名为 Routes-1.11dev-chrism-home . 分叉的源位于 http://bitbucket.org/chrism/routes-home/ (断开的链接);其内容已合并到路由主干(将是路由1.11)。

0.8A5(2009-05-08)

特征

  • 添加了两个新的安全策略:RemoteUserInheritingClSecurityPolicy和WhoInheritingClSecurityPolicy。这些是考虑到的安全策略 all 在上下文的沿袭中定义的ACL,而不是在沿袭中找到的第一个ACL处停止。有关更多信息,请参阅API文档的“安全”一章。

  • 处理安全性的API和叙述性文档被更改,以引入新的“继承”安全策略变体。

  • 为“沿袭”添加了词汇表条目。

废弃

  • 以前命名的安全策略 RepozeWhoIdentityACLSecurityPolicy 现在有了一个更理智的名字 WhoACLSecurityPolicy . 当以“旧”名称导入此策略时,将发出拒绝警告;这通常是由于它在应用程序中的zcml中使用。如果您收到此拒绝警告,请更改ZCML以使用新名称,例如更改:

    <utility
      provides="repoze.bfg.interfaces.ISecurityPolicy"
      factory="repoze.bfg.security.RepozeWhoIdentityACLSecurityPolicy"
      />
    

    到:

    <utility
      provides="repoze.bfg.interfaces.ISecurityPolicy"
      factory="repoze.bfg.security.WhoACLSecurityPolicy"
      />
    

0.8A4(2009年5月4日)

特征

  • zope.testing 不再是直接依赖,尽管我们的依赖(如 zope.interfacerepoze.zcml 等等)仍然依赖它。

  • 在谷歌应用引擎上测试。在文档中添加了一个教程,解释如何将BFG应用程序部署到GAE。

向后不兼容

  • 依赖的应用程序 zope.testing.cleanup.cleanUp 在单元测试中仍然可以无限期地使用该函数。但是,为了获得最大的前向兼容性,它们应该导入 cleanUprepoze.bfg.testing 而不是来自 zope.testing.cleanup . bfg贴纸模板和文档已更改为使用此函数,而不是 zope.testing.cleanup 版本。

0.8a3(2009年5月3日)

特征

  • 不需要成功导入 zope.testing 在bfg应用程序运行时。这样我们就可以摆脱 zope.testing 在像gae这样有文件限制的平台上。

0.8A2(2009年5月2日)

特征

  • 我们不再包括 configure.zcmlchameleon.zpt 包装内 configure.zcml 在“repoze.bfg.includes”包中。一段时间以来,这一直是不允许的。

  • 这个 repoze.bfg.chameleon_zpt 包不再从导入 chameleon.zpt 在模块范围内,在方法调用中将导入延迟到稍后。这个 chameleon.zpt 无法在GAE等平台上导入包。

0.8A1(2009年5月2日)

取消预测警告和导入别名删除

  • 从0.6.1版开始,当名称 model_url 是从导入的 repoze.bfg.traversal 模块。此导入别名(和取消预测警告)已被删除。任何输入 model_url 功能现在需要从 repoze.bfg.url ;名称的任何导入 model_urlrepoze.bfg.traversal 现在会失败。这样做是为了删除对zope.deferredimport的依赖。

  • 从0.6.5版开始,当名称 RoutesModelTraverser 是从导入的 repoze.bfg.traversal 模块。此导入别名(和取消预测警告)已被删除。任何输入 RoutesModelTraverser 现在需要从开始上课 repoze.bfg.urldispatch ;名称的任何导入 RoutesModelTraverserrepoze.bfg.traversal 现在会失败。这样做是为了删除对zope.deferredimport的依赖。

特征

  • 本次发布 repoze.bfg 是“C自由”。这意味着它不依赖于安装时必须从C源代码编译的任何软件。特别地, repoze.bfg 不再依赖于 lxml 包。

    此更改引入了一些向后不兼容,如下面的“向后不兼容”部分所述。

  • 此版本是在Windows XP上测试的。它看起来工作正常,所有的测试都通过了。

向后不兼容

与制造有关的不相容性 repoze.bfg “C自由”:

  • 移除 repoze.bfg.chameleon_genshi 模块,从而支持Genshi风格的变色龙模板。Genshi风格变色龙模板取决于 lxml ,它在C中实现(与纯Python相反),并且 repoze.bfg 从这个版本开始,核心是“无C”的。您可以通过安装 repoze.bfg.chameleon_genshi 套餐可从https://pypi.org/project/repoze.bfg.chameleon genshi/。所有依赖于 chameleon_genshi 此版本之前的模块 repoze.bfg 安装此加载项后应能正常工作。

  • 移除 repoze.bfg.xslt 模块,从而支持XSL模板。这个 repoze.bfg.xslt 依赖的模块 lxml ,在C中实现,并且 repoze.bfg 从这个版本开始,核心是“无C”的。您可以通过安装 repoze.bfg.xslt 套餐可从 http://svn.repoze.org/repoze.bfg.xslt/ (断开链接)(也可在 http://dist.repoze.org/bfg/0.8/simple) (断链)。所有依赖于 xslt 此版本之前的模块 repoze.bfg 安装此加载项后,应在不进行修改的情况下工作。

  • 移除 repoze.bfg.interfaces.INodeTemplateRenderer 接口和从该接口到 repoze.bfg.interfaces.INodeTemplate . 现在必须从 repoze.bfg.xslt.interfaces 安装后的包装 repoze.bfg.xslt 如上所述的附加组件包 repoze.bfg.interfaces.INodeTemplateRenderer . 这个接口从来不是任何公共API的一部分。

其他向后不兼容:

  • 这个 render_template 中的函数 repoze.bfg.chameleon_zpt 返回Unicode而不是字符串。同样,ITerable返回的单个值由 render_template_to_iterable 函数也是每个Unicode。这实际上是从我们新使用的 chameleon.core 1.0B32(非LXML依赖版本)和 chameleon.zpt 1.0B16+; chameleon.zpt pageTemplateFile实现用于返回字符串,但现在返回Unicode。

0.7.1(2009-05-01)

特征

  • “Paster Create”模板已经修改为使用新的“bfg.repoze.org”和“docs.repoze.org”网站的链接。

  • 在“虚拟主机文档”一章的URL前缀处添加了更好的虚拟主机文档。

  • 的接口 repoze.bfg.interfaces.ITraverser 以及实现接口的内置实现 (repoze.bfg.traversal.ModelGraphTraverserrepoze.bfg.urldispatch.RoutesModelTraverser )现在期待 __call__ itraverser的方法返回3个附加参数: traversedvirtual_rootvirtual_root_path (旧合同是 __call__ 返回了ITraverser的方法;三个参数,契约new返回了6个)。 traversed 将是经过遍历的Unicode名称序列(包括虚拟根路径,如果有的话),或者 None 如果没有执行遍历, virtual_root 将是表示虚拟根的模型对象(如果未执行遍历,则为物理根),并且 virtual_root_path 将是表示虚拟根路径(Unicode名称序列)的序列,或者 None 如果没有执行遍历。

    六个论点现在从bfg itraverers返回。它们按以下顺序返回: contextview_namesubpathtraversedvirtual_rootvirtual_root_path .

    bfg代码中调用itraverser的地方继续接受一个3参数的返回值,尽管bfg将在遇到警告时生成并记录警告。

  • 请求对象现在具有以下属性: traversed (遍历的名称序列或 None 如果没有执行遍历, virtual_root (表示虚拟根的模型对象,包括虚拟根路径(如果有)),以及 virtual_root_path (表示虚拟根路径的名称序列或 None 如果没有执行遍历)。

  • 一个叫 wsgiapp2 已添加到 repoze.bfg.wsgi 模块。这个装饰器的功能与 repoze.bfg.wsgi.wsgiapp 但它修复了 SCRIPT_NAMEPATH_INFO 调用wsgi子应用程序之前的环境值。

  • 这个 repoze.bfg.testing.DummyRequest 对象现在具有的默认属性 traversedvirtual_rootvirtual_root_path .

  • 当match dict中的元素被命名时,routesModelTraverser现在的行为更像routes“routesMiddleware”对象。 path_info (通常当有一个模式 http://foo/*path_info )在这种情况下, PATH_INFO 环境变量设置为match dict中的值,并且 SCRIPT_NAME 以原始文件的前缀附加到 PATH_INFO 不包括新变量的值。

  • NotFound调试现在也显示了遍历路径、虚拟根路径和虚拟根路径。

  • 加速/澄清“遍历”模块的“模型路径”、“模型路径元组”和“模型路径列表”功能。

向后不兼容

  • 在以前的版本中, repoze.bfg.url.model_url, repoze.bfg.traversal.model_path and repoze.bfg.traversal.model_path_tuple functions always ignored the __name__ argument of the root object in a model graph ( effectively replacing it with a leading / in the returned value) when a path or URL was generated. The code required to perform this operation was not efficient. As of this release, the root object in a model graph must have a `` _ name_uu``属性 None 或空字符串 ('' )以便从这些API正确生成URL和路径。如果根模型对象具有 __name__ 参数不是这些值之一,您需要更改代码,以便正确生成URL和路径。如果模型图的根节点带有字符串 __name__ 不为空,值为 __name__ 将为生成的每个路径和URL预先设置。

  • 这个 repoze.bfg.location.LocationProxy 类与 repoze.bfg.location.ClassAndInstanceDescr 为了最终摆脱对 zope.proxy . 这些类都不是API。

  • 在所有早期版本中, repoze.bfg.location.locate 函数的工作方式是这样的:如果模型没有显式地提供 repoze.bfg.interfaces.ILocation 接口, locate 返回A LocationProxy 对象表示 model 用它 __parent__ 分配给的属性 parent 和A __name__ 分配给的属性 __name__ . 在这个版本中, repoze.bfg.location.locate 函数仅阻塞 __name____parent__ 无条件地将属性赋给所提供的模型,无论对象是否实现iLocation,并且它从不返回代理。这是因为locationProxy行为现在已移动到加载项包中。 (repoze.bfg.traversalwrapper ,以便最终能够摆脱对 zope.proxy .

  • 在所有以前的版本中,默认情况下,如果使用了遍历(而不是URL调度),并且根对象提供了``repoze.bfg.interfaces.ilocation``接口,但子对象通过 __getitem__ 返回一个未实现同一接口的对象, repoze.bfg 在遍历期间提供了一些隐式帮助。此遍历功能从未实现的根(及其后)包装子对象 ILocation 在自动向其提供 __name____parent__ 基于要遍历的名称和上一个对象的属性。此功能现在已从基础中删除 repoze.bfg 为了最终摆脱对 zope.proxy .

    为了重新启用无法更改的旧应用程序的包装行为,请注册“TraversalWrapper” ModelGraphTraverser 作为遍历策略,而不是默认策略 ModelGraphTraverser . 要使用此功能,您需要安装 repoze.bfg.traversalwrapper 软件包(附加软件包,可从https://pypi.org/project/repoze.bfg.traversalwrapper/)然后更改应用程序的 configure.zcml 包括以下章节:

    <适配器

    factory=“repoze.bfg.traversalwrapper.modelgraphtraverser”为=“*”/>

    如果使用此ITraverFactory而不是默认值,则图表中的任何对象(甚至根对象)都不能提供 __name____parent__ 属性。即使子对象从根返回 do 实现iLocation接口,这些接口仍将包装在重写对象的“real”的代理中。 __parent____name__ 属性。

    另请参见文档的“模型”章节的更改(在“位置感知模型实例”部分中)。

0.7.0(2009-04-11)

漏洞修补

  • 修复错误 repoze.bfg.wsgi.HTTPException :内容长度返回为int而不是字符串。

  • 在上添加显式依赖项 zope.deferredimportzope.deprecationzope.proxy 出于向前兼容的原因 (zope.component 将不再依赖 zope.deferredimport 很快,尽管我们直接使用它,但它只是一个可传递的依赖项,以及“zope.deprecation”, zope.proxy 直接使用,即使它们也是可传递的依赖项)。

  • 使用 model_urlmodel_path 针对损坏的模型图(其中一个模型具有非根模型 __name__ 属于 None )导致引发无法解释的错误:(如果不是) _must_quote[cachekey].search(s): TypeError: expected string or buffer )现在,针对中间节点中没有名称的图生成的URL和路径将用空字符串替换none,因此不会引发错误。当然,URL或路径仍然是假的。

特征

  • 使 testing.DummyTemplateRenderer 返回一些非默认字符串表示形式。

  • 增加了一个新的 anchor 关键字参数 model_url . 如果 anchor 如果存在,则其字符串表示形式将用作生成的URL中的命名锚(例如,如果 anchor 传递为 foo 模型URL是 http://example.com/model/url ,生成的URL将 http://example.com/model/url#foo

向后不兼容

  • 默认的请求字符集编码现在是 utf-8 . 因此,当通过以下方式获取值时,请求机器将尝试自动将UTF-8编码中的值解码为Unicode request.paramsrequest.GETrequest.POST . bfg以前的行为是在以这种方式访问值时返回一个bytestring。这种更改将破坏应用程序中的表单处理代码,这些应用程序依赖于被字符串考虑的那些API的值。如果要手动解码应用程序中表单提交的值,则需要更改执行此操作的代码,以期望Unicode值来自 request.paramsrequest.GETrequest.POST 或者您需要显式地重新启用以前的行为。若要重新启用以前的行为,请将以下内容添加到应用程序的 configure.zcml ::

    <subscriber for="repoze.bfg.interfaces.INewRequest"
                handler="repoze.bfg.request.make_request_ascii"/>
    

    另请参阅BFG文档“视图”一章中题为“使用视图处理表单提交(Unicode和字符集问题)”的文档。

文档

  • 在“叙述性视图”一章中添加一节,标题为“使用视图处理表单提交(Unicode和字符集问题)”,解释表单数据值的隐式解码。

0.6.9(2009年2月16日)

漏洞修补

  • LRU缓存在并发性下不稳定(大惊喜!)当它试图在缓存中重新删除已删除的密钥时。症状:第64行输入:del数据 [奥尔基] :keyror:“/some/path”。现在,如果不能删除键(它已经被删除),我们就忽略键错误。

  • 使用生成URL时模型路径中的空位置名 repoze.bfg.model_url 基于通过遍历获得的模型,在生成的URL中不再被忽略。这意味着如果非根模型对象具有 __name__ 属于 '' ,URL将反映它(例如 model_url 将生成 http://foo/bar//baz 如果对象具有 __name__ 属于 '' 是Bar的子级和Baz的父级)。但是,模型图遍历器在请求进入时(遍历器除去空路径段名称),仍然无法解析由空路径段生成的URL。

特征

  • 小孢子 repoze.bfg.traversal.model_pathrepoze.bfg.traversal.model_path_tuplerepoze.bfg.traversal.quote_path_segmentrepoze.bfg.url.urlencode .

  • 将zip_safe=false添加到setup.cfg。

文档

  • 向添加注释 repoze.bfg.traversal.quote_path_segment 关于缓存计算值的API文档。

实施变更

  • 简化 repoze.bfg.traversal.TraversalContextURL.__call__ (现在使用 repoze.bfg.traversal.model_path 而不是滚动自己的路径生成)。

0.6.8(2009年2月5日)

向后不兼容

  • 这个 repoze.bfg.traversal.model_path API now returns a quoted string rather than a string represented by series of unquoted elements joined via / characters. Previously it returned a string or unicode object representing the model path, with each segment name in the path joined together via `` /字符,例如 ``/foo /bar . 现在它返回一个字符串,其中每个段都是一个UTF-8编码的、带URL引号的元素,例如 /foo%20/bar . 此更改(如repose dev maillist中简要讨论的)是容纳模型对象所必需的,这些对象本身具有 __name__ 包含 / 性格。

    对于没有高阶Unicode模型的人 __name__ 属性或 __name__ 属性的值需要在其模型图中引用URL,这不会导致任何问题。但是,如果您有当前期望的代码 model_path 要返回一个未加引号的字符串,或者您有一个现有的应用程序,其中包含通过旧方法生成的数据,并且您太懒于更改任何内容,您可能希望替换导入的BFG。 model_path 在您使用此函数的代码中(这是“旧”的代码 model_path 实施)::

    from repoze.bfg.location import lineage
    
    def i_am_too_lazy_to_move_to_the_new_model_path(model, *elements):
        rpath = []
        for location in lineage(model):
            if location.__name__:
                rpath.append(location.__name__)
        path = '/' + '/'.join(reversed(rpath))
        if elements:
            suffix = '/'.join(elements)
            path = '/'.join([path, suffix])
        return path
    
  • 这个 repoze.bfg.traversal.find_model API不再将作为Unicode对象传递给它的完整路径的Unicode表示形式隐式转换为UTF-8字符串。调用方应使用由 repoze.bfg.traversal.model_path 或由结果返回的元组值 repoze.bfg.traversal.model_path_tuple 或者他们应该使用有关传递字符串的准则 path 中描述的参数 find_model API文档。

错误修正

  • 中包含的每个参数 elements passed to repoze.bfg.traversal.model_path will now have any / characters contained within quoted to `` %2f``在返回的字符串中。以前, / 元素中的字符没有加引号(错误)。

特征

  • A repoze.bfg.traversal.model_path_tuple 添加了API。此API是 model_path (返回字符串); model_path_tuple 以元组形式返回模型路径(与Zope的非常类似 getPhysicalPath

  • A repoze.bfg.traversal.quote_path_segment 添加了API。此API将引用单个路径段(字符串或Unicode对象)。见 repoze.bfg.traversal 有关更多信息,请参阅API文档。

  • 这个 repoze.bfg.traversal.find_model API现在接受“路径元组”(请参见上面关于 model_path_tuple )以及字符串路径表示(从 repoze.bfg.traversal.model_path 作为一个 path 参数。

  • 添加 ` ` renderer``参数(默认为无)到 repoze.bfg.testing.registerDummyRenderer . 例如,这使得注册在单元测试中引发异常的自定义呈现器成为可能。

实施变更

  • 已将“url”引号函数移回 repoze.bfg.traversalrepoze.bfg.url . 这不是API。

0.6.7(2009年1月27日)

特征

  • 这个 repoze.bfg.url.model_url API现在可以处理从路由URL调度派生的上下文。 (Routes.util.url_for 被称为引擎盖下)。

  • 已添加对基于遍历的应用程序的“虚拟根”支持。当您希望在 repoze.bfg 将图形作为URL路径名下的应用程序建模,该路径名不包括模型路径本身。有关详细信息,请参阅文档中的(新)“虚拟主机”一章。

  • A repoze.bfg.traversal.virtual_root 已添加API。调用时,它返回虚拟根对象(如果未指定虚拟根,则返回物理根对象)。

实施变更

  • repoze.bfg.traversal.RoutesModelTraverser 已移至 repoze.bfg.urldispatch .

  • model_url 现在,通过基于上下文和请求的适配器查找来执行URL生成。

  • ZCML,它为 IContextURL 接口已添加到中的configure.zcml repoze.bfg.includes .

0.6.6(2009年1月26日)

实施变更

  • 有一个间接的 repoze.bfg.url.model_url 现在,它咨询一个实用程序来生成基本模型URL(没有额外的元素或查询字符串)。最终,这将为虚拟主机服务;目前,它是无文件的,不应该被钩住。

0.6.5(2009-01-26)

特征

  • 您现在可以覆盖未找到和未经授权的响应 repoze.bfg 在找不到视图或由于缺少权限而无法调用视图时生成。有关更多信息,请参阅文档中的“ZCML Hook”一章。

  • 在文档中添加了routes zcml指令属性解释。

  • 增加了一个 traversal_path 遍历模块的API;请参阅文档中的“遍历”API章节。这是一个以前称为 split_path 这不是API,但人们无论如何都在使用它。不像 split_path 它现在返回一个元组而不是一个列表(因为它的值是缓存的)。

行为改变

  • 这个 repoze.bfg.view.render_view_to_response 如果它调用的视图函数返回的对象不具有某些属性,则API将不再引发ValueError。 (headerlistapp_iterstatus )此API用于尝试使用 is_response 中的函数 repoze.bfg.view 提出了一个 ValueError 如果 is_response 检查失败。现在,调用者的职责是确保视图函数的返回值是“真实”响应。

  • 传递给的wsgi environ dicts repoze.bfg 的路由器现在必须包含一个请求方法键/值;如果不包含,则会引发一个键错误(速度)。

  • 不再允许将主体的“嵌套”列表传递给 repoze.bfg.ACLAuthorizer.permits (例如) ['fred', ['larry', 'bob']] )主体列表必须完全展开。这个特性从未被记录,也从未是API,所以它不是向后不兼容的。

  • 不再允许安全ACE包含“嵌套”权限列表(例如 ``(Allow, Everyone, ['read', ['view', ['write', 'manage']]])`)`. The list must instead be fully expanded (e.g. `` (允许,所有人, [“读取”、“查看”、“写入”、“管理”] “”。这个特性从未被记录,也从未是API,所以它不是向后不兼容的。

  • 这个 repoze.bfg.urldispatch.RoutesRootFactory 现在注入 wsgiorg.routing_args 路由匹配时,环境变量进入环境。这是一个((),路由参数)的元组,其中路由参数是从路由映射器匹配返回的值(“match dict”)。

  • 这个 repoze.bfg.traversal.RoutesModelTraverser 类现在想获得 view_namesubpathwsgiorgs.routing_args 环境变量。为了向后兼容,它返回到从上下文中获取这些内容。

实施变更

  • 摆脱 repoze.bfg.security.ACLAuthorizerACLSecurityPolicy 现在做它所做的内联。

  • 摆脱 repoze.bfg.interfaces.NoAuthorizationInformation 例外:它仅由 ACLAuthorizer .

  • 使用本地的NotFound错误而不是 webob.exc.HTTPNotFound (后者很慢)。

  • 使用本地未经授权的错误而不是 webob.exc.Unauthorized (后者很慢)。

  • 这个 repoze.bfg.lru.lru_cached decorator现在使用functools.wrapps以使LRU缓存函数的文档成为可能。

  • 各种速度微调。

漏洞修补

  • repoze.bfg.testing.DummyModel 没有一个 get 方法;现在可以了。

0.6.4(2009年1月23日)

向后不兼容

  • 这个 unicode_path_segments 配置变量和 BFG_UNICODE_PATH_SEGMENTS 配置变量已被删除。路径段现在总是传递给模型 __getitem__ 方法为Unicode。”自0.5.4以来,“真”是此设置的默认值,但是将此配置设置更改为“假”允许您返回到将原始路径元素字符串传递给模型 __getitem__ 方法。移除这个旋钮可以实现一个速度目标(通过移除检查,我们可以获得+80 req/s),而且更清楚的是,在模型中总是期望unicode路径段 __getitem__ 方法。

实施变更

  • repoze.bfg.traversal.split_path 现在还处理将路径段解码为Unicode(为了提高速度,因为它的结果是缓存的)。

  • repoze.bfg.traversal.step 做了一个方法

    ModelGraphTraverser。

  • 使用“预编好的”请求子类(例如 repoze.bfg.request.GETRequest )与中的HTTP请求方法相对应的 router.py 构造请求对象而不是使用 alsoProvides 将适当的接口附加到未经bclassed的 webob.Request . 此模式纯粹是一种优化(例如,阻止调用 alsoProvides 指MacBook 2GHz上590 r/s和690 r/s之间的差异)。

  • 通过更改路由器来梳理额外的4%的性能提升;不要使用导入的ZCA API,而是直接对路由器的属性注册表使用相同的API。

  • bfg使用的注册表现在是 zope.component.registry.Components (定义为 repoze.bfg.registry.Registry )它有一个 notify 方法,A registerSubscriptionAdapter 和A registerHandler 方法。如果没有订户通过注册 registerHandlerregisterSubscriptionAdapternotify 是速度的一个转折点。

  • 允许和拒绝的课程 repoze.bfg.security 现在对于构建一个关于速度的原因消息的表示更加懒惰; repoze.bfg.view_execution_permitted 利用这一点。

  • 这个 is_response 检查速度加快了一半左右,代价是使代码稍微变丑。

新模块

  • repoze.bfg.lru 实现一个LRU缓存类和一个内部使用的修饰符。

0.6.3(2009年1月19日)

漏洞修补

  • 雷丁 root_policy 路由器对象上的属性(作为返回iRotFactory实用程序的属性)。它在0.6.2中被无意中移除。野外的代码取决于它的存在(特别是脚本和“调试”助手)。

特征

  • URL调度已经过大修:不再需要在应用程序的可调用入口点中手动创建一个RoutesMapper,以便使用URL调度(aka Routes )一个新的 route 指令已添加到zcml指令的可用列表中。各 route 插入到应用程序的 configure.zcml 建立路由映射器连接。如果有的话 route 声明是通过zcml在特定的应用程序中进行的, get_root 可调用传入到 repoze.bfg.router.make_app 将自动包装在相当于routesmapper的文件中。此外,新的 route 指令允许指定 context_interfaces 路由的属性,当路由指定 context_interfaces 属性匹配。

  • 一种新的接口 repoze.bfg.interfaces.IContextNotFound 加入。当路由找不到匹配项并且没有使用遍历的“fallback”get_root callable时,此接口将附加到生成的“dummy”上下文。

  • 这个 bfg_starterbfg_zodb “Paster Create”模板现在包含图像和CSS,在初始项目生成后显示默认页面时显示这些图像和CSS。

  • 允许 repoze.bfg.view.static 要传递给的助手 root_path 名称;它将被视为相对于调用它的文件。

  • 的功能 repoze.bfg.convention 已合并到核心中。利用 repoze.bfg.convention 将继续无限期地工作,但建议应用程序停止依赖它。为此,替代进口 repoze.bfg.convention.bfg_view 随着进口 repoze.bfg.view.bfg_view ,并将zcml中的节从 <convention package="."><scan package="."> . 合并的结果是,bfg增加了一个新的依赖项: martian .

  • 使用pushpage装饰器的视图函数现在是可pickle的(这意味着它们的使用不会阻止 configure.zcml.cache 文件被写入磁盘)。

  • 而不是总是使用 webob.Request 作为“请求工厂”(例如 Router 类) webob.Response 以及“响应工厂”(例如 render_template_to_response ,允许通过zcml实用程序Hook重写这两个。有关更多信息,请参阅文档的“使用zcmlHook”一章。

废弃

  • repoze.bfg.urldispatch.RoutesContext 已重命名为 repoze.bfg.urldispatch.DefaultRoutesContext . 类应该根据需要使用新名称导入(尽管实际上它可能不应该从除bfg内部之外的任何地方导入,因为它不是API的一部分)。

实施变更

  • 这个 repoze.bfg.wsgi.wsgiapp 装饰器现在使用 webob.Request.get_response 做它的工作,而不是依赖于国产的wsgi代码。

  • 这个 repoze.bfg.view.static 帮手现在用 webob.Request.get_response 做它的工作,而不是依赖于国产的wsgi代码。

  • 这个 repoze.bfg.urldispatch.RoutesModelTraverser 类已移动到 repoze.bfg.traversal.RoutesModelTraverser .

  • 这个 repoze.bfg.registry.makeRegistry 函数已重命名为 repoze.bfg.registry.populateRegistry 现在接受 registry 参数(应该是 zope.component.registry.Components

文档添加

  • 更新了叙述URLDispatch章节,其中包含 <route..> ZCML指令。

  • 在文档的url dispatch章节中添加一节“使用带有url调度的bfg安全性”。

  • 更好地记录repoze.bfg附带的安全策略实现。

  • 在叙述模板一章中增加了“在repoze.bfg中使用zpt宏”一节。

0.6.2(2009年1月13日)

特征

  • 如果您有 nose 安装在用于运行测试的解释器中。使用解释程序 nose 安装,做 python setup.py nosetestsrepoze.bfg 包以查看测试覆盖率输出。

  • 增加了一个 post 论据 repoze.bfg.testing:DummyRequest 建造师。

  • 补充 __len____nonzero__repoze.bfg.testing:DummyModel .

  • 这个 repoze.bfg.registry.get_options 可调用(现在重命名为 repoze.bfg.setings.get_options )用于在返回的字典中仅返回框架特定的键和值。它现在返回它所传递的字典中的所有键和值 plus 从环境中选择的任何特定于框架的设置。作为副作用,所有特定于PasteDeploy应用程序的配置文件设置都作为 ISettings BFG内的公用设施。

  • 已将现有的bfg粘贴程序模板重命名为 bfg_starter . 添加了另一个模板 (bfg_zodb )显示默认的zodb安装程序,使用 repoze.zodbconn .

  • 添加名为的方法 assert_ 给DummyTemplatenderer。此方法接受关键字参数。关键字参数中的每个键/值对都会导致断言渲染器接收到该键的值等于断言值。

  • 由粘贴模板生成的项目现在使用 DummyTemplateRenderer.assert_ 方法。

  • 使(内部)线程本地注册表管理器维护一组注册表,以便能够从内部调用一个BFG应用程序。

  • 入口上的每个请求对象都附加了一个特定于HTTP动词(get/put/post/delete/head)的接口。HTTP谓词相关接口在中定义。 repoze.bfg.interfaces 并且是 IGETRequestIPOSTRequestIPUTRequestIDELETERequestIHEADRequest . 这些接口可以指定为 request_type bfg视图声明的属性。只有使用与传入请求中的HTTP谓词匹配的请求类型定义视图时,才会找到命名特定HTTP谓词匹配接口的视图。更一般的 IRequest 接口可以用作捕获所有请求的请求类型(这确实是默认值)。所有请求实现 IRequest . HTTP动词匹配思想是由 repoze.bfg.restrequest . 这个包不再需要了,但仍然可以正常工作。

漏洞修补

  • 修复粘贴配置的错误 unicode_path_segments (和操作系统环境 BFG_UNICODE_PATH_SEGMENTS )在某些情况下,可能一直违约为假。它现在总是默认为true,匹配文档和意图。

  • 这个 repoze.bfg.traversal.find_model 当通过 path 参数,该参数是Unicode,并且在 unicode_path_segmentsBFG_UNICODE_PATH_SEGMENTS 配置变量为“真”。

  • 添加了一个新模块: repoze.bfg.settings . 这包含与部署设置相关的代码。

实施变更

  • 这个 make_app 可调用的 repoze.bfg.router 现在注册 root_policy 作为实用程序的参数(未命名,使用 repoze.bfg.interfaces.IRootFactory 而不是将它作为第一个参数传递给 repoze.bfg.router.Router 类。因此, repoze.bfg.router.Router Router类只接受一个参数: registry . 这个 repoze.bfg.router.Router 类现在通过实用工具查找来检索根策略。这个 repoze.bfg.router.make_app API现在还执行一些以前在内部处理过的重要应用程序注册。 repoze.bfg.registry.makeRegistry .

新模块

  • A repoze.bfg.settings 模块已添加。它包含与部署设置相关的代码。它包含的大多数代码都是从 repoze.bfg.registry 模块。

行为改变

  • 这个 repoze.bfg.settings.Settings 类(其实例注册为提供 repoze.bfg.interfaces.ISettings 当任何应用程序启动时)现在自动调用 repoze.bfg.settings.get_options 在传递给其构造函数的选项上。这意味着 get_options 在应用程序中 make_app 不再需要函数(“raw” options 听写或不传)。

  • 清除试图从试图拔出的伤风中恢复的旧感冒。 z3c.pt 模板;变色龙已经成为模板引擎很长一段时间了。运行repoze.bfg来对付已经腌制过的沙盒 z3c.pt 模板现在只会由于取消拾取错误而失败,但可以通过删除模板缓存文件来修复。

废弃

  • 感动了 repoze.bfg.registry.Settings 类。已将此移动到 repoze.bfg.settings.Settings . 当从旧位置导入时,将发出拒绝警告。

  • 感动了 repoze.bfg.registry.get_options 此功能已移动到 repoze.bfg.settings.get_options . 当从旧位置导入时,将发出拒绝警告。

  • 这个 repoze.bfg.interfaces.IRootPolicy 接口在接口包中被重命名。它已重命名为 IRootFactory . 当从旧位置导入时,将发出拒绝警告。

0.6.1(2009年1月6日)

新模块

  • 一个新的模块 repoze.bfg.url 已添加。它包含了 model_url API(从 repoze.bfg.traversal )以及 urlencode (像 Python 一样) urllib.urlencode )它可以处理 query 参数。

废弃

  • 这个 model_url 函数已从移动 repoze.bfg.traversal 进入之内 repoze.bfg.url . 它仍然可以从 repoze.bfg.traversal 但是从 repoze.bfg.traversal 将发出拒绝警告。

特征

  • A static 帮助程序类已添加到 repoze.bfg.views 模块。此类的实例愿意充当使用磁盘上的文件返回静态资源的BFG视图。见 repoze.bfg.view 获取更多信息。

  • 这个 repoze.bfg.url.model_url API(NEE) repoze.bfg.traversal.model_url )现在接受并尊重一个名为 query . 此参数的值将用于组成一个查询字符串,该字符串将在返回之前附加到生成的URL。查看API文档(在docs目录或web上 http://static.repoze.org/bfgdocs )(断开的URL)以获取更多信息。

0.6(2008年12月26日)

向后不兼容

  • 而不是从 zope.configuration 包装下使用 repoze.bfgrepoze.bfg 现在可以使用来自 repoze.zcml 包装(参见https://pypi.org/project/repoze.zcml/). 因此 repoze.bfg 包装现在取决于 repoze.zcml 包装,不再直接依赖于 zope.componentzope.configurationzope.interfacezope.proxy 包装。

    这种变化的主要原因是使我们能够最终减少不适当的数量 repoze.bfg Zope包依赖项,以及摆脱依赖包指令的不合理功能 repoze.bfg .

    请注意,目前使用BFG所需的一组要求没有改变。这是由于在 chameleon.zpt 希望很快就能解决。注:在柠檬水索引中,存在一个1.0b8-repozezcml0包,它可以消除这些要求。

  • 在此发布之前编写的BFG应用程序,预计“库存” zope.component ZCML指令实现(例如 adaptersubscriberutility )要现在运行,必须1)包括 meta.zcml 文件从 zope.component 手动(例如) <include package="zope.component" file="meta.zcml"> )包括 zope.security 包作为 install_requires 依赖项或2)更改其应用程序中的zcml以使用来自的声明 repoze.zcml 而不是股票申报。 repoze.zcml 只提供 adaptersubscriberutility 指令。

    简而言之,如果您有一个现有的bfg应用程序,在这个更新之后,如果您的应用程序由于“zope.security”的导入错误而无法启动,那么让它重新工作的最快方法是添加 zope.security 到bfg应用程序的“安装要求” setup.py ,然后在应用程序的 configure.zcml ::

    <include package="zope.component" file="meta.zcml">
    

    然后重新``setup.py develop``或重新安装应用程序。

  • 这个 http://namespaces.repoze.org/bfg 对于Paster生成的应用程序,XML名称空间现在是zcml中的默认XML名称空间。文档已更新以反映这一点。

  • BFG的副本 meta.zcmlconfigure.zcml 从根目录中删除 repoze.bfg 包。在0.3.6中,名为 repoze.bfg.includes 添加,其中包含这些zcml文件的“正确”副本;删除的副本是为了向后兼容。

  • BFG view zcml指令不再调用 zope.component.interface.provideInterface 对于 for 接口。我们不支持 provideInterface 因为它改变了全局注册表。

其他

  • 最低要求 chameleon.core 现在是1.0B13。最低要求 chameleon.zpt 现在是1.0B8。最低要求 chameleon.genshi 现在是1.0B2。

  • 将贴纸模板“ez_setup.py”更新为需要安装工具0.6c9的模板。

  • 转弯 view_execution_permittedrepoze.bfg.view 模块化到文档化的API中。

  • 清除文件。

  • 记录了如何创建能够为静态资源提供服务的视图。

0.5.6(2008年12月18日)

  • 加快 traversal.model_url 通过使用自定义的URL引用函数而不是python的 urllib.quote ,通过缓存URL路径段引用和编码结果,通过放弃python的 urlparse.urljoin 支持简单的字符串连接,并使用 ob.__class__ is unicode 而不是 isinstance(ob, unicode) 在一个战略位置。

0.5.5(2008年12月17日)

向后不兼容

  • 在过去,在遍历期间,ModelGraphTraverser(默认遍历器)总是将每个URL路径段传递给 __getitem__ 作为字节字符串的模型对象的方法(a str 对象)。现在,默认情况下,ModelGraphTraverser尝试将路径段解码为Unicode(A unicode 对象)在将其传递给 __getitem__ 模型对象的方法。这使得模型对象在 __getitem__ 当试图解析一个子对象时,由于模型对象本身不再需要尝试预测是否尝试解码遍历器传递的路径段。

    请注意,从0.5.4开始,repoze.bfg生成的URL model_url API将根据需要包含UTF-8编码的路径段,因此BFG本身生成的任何URL都可以被遍历器解码。如果另一个应用程序生成BFG应用程序的URL,要成功解析,它应该生成包含要成功解析的UTF-8编码路径段的URL。解码器一点也不神奇:如果在URL中传递了一个非UTF-8可解码的路径段(例如,使用UTF-16编码的路径段或其他一些不正常的路径段),BFG将引发一个 TypeError 消息指示它无法解码路径段。

    若要启用较旧的行为,路径段在传递到模型对象之前未解码为Unicode __getitem__ 由遍历器传递,并作为原始字节字符串传递,设置 unicode_path_segments 在paste.ini文件的bfg应用程序节中将配置设置为假值,例如:

    unicode_path_segments = False
    

    或者使用 BFG_UNICODE_PATH_SEGMENT envvar设置为假值:

    BFG_UNICODE_PATH_SEGMENTS=0
    

0.5.4(2008年12月13日)

向后不兼容

  • URL引号“extra”元素名称作为 **elementstraversal.model_url 应用程序编程接口。如果这些名称中有任何一个是Unicode字符串,请在URL引用之前将其编码为UTF-8。这是一种轻微的向后不兼容,如果您已经使用了UTF-8编码或URL引用了作为 elements 这个API。

错误修正

  • utf-8对模型路径中用于生成URL的每个段进行编码,然后在 traversal.model_url 应用程序编程接口。这是一个错误修复,因为unicode不能总是被成功地引用url。

特征

  • 使使用构建生成的python“解释器”运行单元测试成为可能。

  • 添加 request.rootrouter.Router 以便轻松访问应用程序根目录。

0.5.3(2008年12月7日)

  • 移除 ITestingTemplateRenderer 接口。什么时候? testing.registerDummyRenderer 而是使用 ITemplateRenderer 接口,在内置模板工具进行渲染时检查该接口。此更改还允许开发人员在ZCML注册表中针对 ITemplateRenderer ;在查找任何磁盘模板之前都会找到这些模板。

0.5.2(2008年12月5日)

  • 视图(函数或类实例)的组件注册处理程序现在观察组件适应注释(请参见 zope.component.adaptedBy )并在回退值之前使用它们 for_request_type . 此更改不会影响现有代码,因为在视图上设置注释时(不太可能),代码不依赖这些默认值。这意味着对于一个新的风格的类,你可以 zope.component.adapts(ISomeContext, ISomeRequest) 在类作用域或模块作用域作为bfg视图函数的修饰器,您可以这样做 @zope.component.adapter(ISomeContext, ISomeRequest) . 这与r.bfg.convention有所不同,因为您仍然需要在zcml中放置一些内容,以便完成注册;只有这些声明存在时,默认值才会改变。

  • 在横移机械内的干净路径中,从路径的末端和开始剥离所有斜线。

0.5.1(2008年11月25日)

  • 添加 keysitemsvalues 方法到 testing.DummyModel .

  • 添加 __delitem__ 方法到 testing.DummyModel .

0.5.0(2008年11月18日)

  • 修复modelgraphtraverser;不要尝试更改 __name____parent__ 在遍历期间声明它实现iLocation的对象,即使 __name____parent__ 遍历的对象的名称与遍历步骤或或遍历父级中使用的名称不匹配。理由:这样做是愚蠢的。只有在应用程序中错误地配置了中间持久的非iLocation对象时,才发现此错误;遍历导致对此设置下的每个请求进行持久写入。

  • repoze.bfg.location.locate 现在无条件设置 __name____parent__ 在提供iLocation的对象上(它以前只在它们不匹配通过相等存在于对象上的属性时有条件地设置它们)。

0.4.9(2008年11月17日)

  • 添加变色龙文本模板API(变色龙$名称渲染,模板不需要包装在任何包含XML中)。

  • 根据virtualenv(无条件)更改文档以解释安装。

  • 使pushpage decorator与repoze.bfg.convention兼容 bfg_view 当他们被堆起来的时候。

  • 将content_-length属性添加到testing.dummyRequest。

  • 更改贴纸模板 tests.py 包括一个真正的单元测试。将旧测试保留为集成测试。更新文档。

  • 针对类和的文档视图注册 repoze.bfg.convention 在上下文中。

  • 更改默认的粘贴器模板,以便针对类而不是接口注册其单个视图。

  • 在事件说明文档中,通过订户函数向请求添加请求类型接口的文档。

0.4.8(2008年11月12日)

向后不兼容

  • repoze.bfg.traversal.model_url 现在总是在所有生成的URL后面加一个斜杠,除非将更多的元素作为第三个和后面的参数传入。理由:视图经常使用 model_url 没有第三个参数和以下参数,以便为模型生成URL,以便指向模型的默认视图。指向默认视图的URL root 模型在技术上 http://mysite/ 而不是 http://mysite (浏览器恰好在GET请求中隐式地请求“/”)。因为任何东西都不会自动生成URL 除了 模型由 model_url 因为根模型并不特别,所以我们继续这个模式。这一变化的影响是最小的(最多你会有太多的斜线在你的网址,而bfg处理得当)。

0.4.7(2008年11月11日)

特征

  • 允许 testing.registerEventListener 用于Zope3样式的“对象事件”(订阅服务器接受多个事件参数)。我们用参数扩展列表,而不是追加。

0.4.6(2008年11月10日)

漏洞修补

  • 这个 model_pathmodel_url 遍历API为根对象返回了错误的值(例如 model_path 返回 '' 对于根对象,虽然它应该返回 '/'

0.4.5(2008年11月9日)

特征

  • 增加了一个 clone 方法与A __contains__ 方法对DummyModel测试对象。

  • 允许dummymmodel对象接收额外的关键字参数,这些参数将作为属性附加。

  • DummyTemplatenderer现在回来了 self 作为其实施。

0.4.4(2008年11月8日)

特征

  • 增加了一个 repoze.bfg.testing 模块试图使编写基于单元测试的BFG应用程序自动测试稍微容易一些。有关此模块的信息在文档中。

  • 默认模板渲染器现在通过查找 ITestingTemplateRenderer 使用相对路径名。这是通过名为 registerTemplateRenderer 在里面 repoze.bfg.testing .

废弃

  • 名字 repoze.bfg.interfaces.ITemplaterepoze.bfg.interfaces.ITemplateFactoryrepoze.bfg.interfaces.INodeTemplate 已弃用。这些现在应该作为 repoze.bfg.interfaces.ITemplateRendererrepoze.bfg.interfaces.ITemplateRendererFactoryINodeTemplateRenderer 分别。

  • 名字 repoze.bfg.chameleon_zpt.ZPTTemplateFactory 被贬低。使用 repoze.bfg.chameleon_zpt.ZPTTemplateRenderer .

  • 名字 repoze.bfg.chameleon_genshi.GenshiTemplateFactory 已弃用。使用 repoze.bfg.chameleon_genshi.GenshiTemplateRenderer .

  • 名字 repoze.bfg.xslt.XSLTemplateFactory 已弃用。使用 repoze.bfg.xslt.XSLTemplateRenderer .

0.4.3(2008-11-02)

漏洞修补

  • 如果不将“get-options”的结果作为make-app的第二个参数传递,则在尝试查找isettings对象(内部)的设置时可能会导致属性错误。通过为设置对象提供默认值来修复 debug_authorizationdebug_notfound .

  • 返回的实例 Allowed (而不是 True )从 has_permission 当没有使用安全策略时。

  • 修复授权检查中默认拒绝将引发类型错误的错误(使用 ACLDenied 而不是 Denied

0.4.2(2008年11月2日)

特征

  • 将名为“repoze.bfg.debug”的单个ilogger公开为实用程序;此记录器是无条件注册的,由授权调试机器使用。为了方便起见,应用程序也可以根据需要使用它,而不是发明自己的记录器。

  • 这个 BFG_DEBUG_AUTHORIZATION 恩瓦尔和 debug_authorization 配置文件值现在只意味着调试视图调用的安全检查。以前,每次呼叫都会打印信息 has_permission 同样,这使得输出令人困惑。调试 has_permission 检查和其他手动权限检查,在您自己的代码中使用调试程序和打印语句。

  • 授权调试信息现在只存在于HTTP响应主体oif中 debug_authorization 是真的。

  • 改进了授权调试消息的格式。

  • 一个新的 BFG_DEBUG_NOTFOUND 添加了envvar和对称的 debug_notfound 已添加配置文件值。如果两者都为真,并且bfg路由器返回NotFound响应(因为找不到视图),调试信息将打印到stderr。当该值设置为true时,httpNotFound响应的主体也将包含相同的调试信息。

  • AllowedDenied 来自安全机制的响应现在被专门化为两种类型:ACL类型和非ACL类型。与ACL相关的响应是 repoze.bfg.security.ACLAllowedrepoze.bfg.security.ACLDenied . 非ACL相关的响应是 repoze.bfg.security.Allowedrepoze.bfg.security.Denied . 允许的类型响应继续计算等于其自身计算等于 True 布尔值,而被拒绝的类型响应继续计算等于其自身计算等于 False 布尔函数。这两种类型之间唯一的区别是为了调试而附加到它们上的信息。

  • 增加了一个新的 BFG_DEBUG_ALL envvar和对称 debug_all 配置文件值。如果其中一个为真,则所有其他与调试相关的标志都将无条件设置为真(例如 debug_notfounddebug_authorization

文档

  • 添加了有关调试标志更改的信息。

  • 在安全章节中添加了一节,名为“调试强制授权失败”(例如 has_permssion

漏洞修补

  • 更改要使用的默认粘贴模板生成器 Paste#http 服务器而不是 PasteScript#cherrpy 服务器。当 REMOTE_USER 被下游应用程序信任。

0.4.1(2008年10月28日)

漏洞修补

  • 如果 render_view_to_response 调用了函数,如果找到并调用了视图,但它返回了一些未实现IResponse的内容,则错误将通过未标记的方式传递。当我创建一个基本上不返回任何值的视图函数时,注意到了这一点,但在呈现视图时收到了一个NotFound错误而不是ValueError。这是固定的。

0.4.0(2008年10月3日)

文档

  • 在文档的叙述部分添加了“环境和配置”一章。

特征

  • 确保bfg在Python2.6下运行时不会生成警告。

  • 环境变量 BFG_RELOAD_TEMPLATES 现在可用(与 reload_templates 在配置文件中)。

  • 新的配置文件选项 debug_authorization 加入。这将打开安全授权调试语句的打印以 sys.stderr . 这个 BFG_DEBUG_AUTHORIZATION 还添加了环境变量;这将执行相同的任务。

漏洞修补

  • 环境变量 BFG_SECURITY_DEBUG 并不总是有效。它已重命名为 BFG_DEBUG_AUTHORIZATION 固定。

废弃

  • 当旧的API名称来自 repoze.bfg.templates 模块已导入。

向后不兼容

  • 这个 BFG_SECURITY_DEBUG 环境变量已重命名为 BFG_DEBUG_AUTHORIZATION .

0.3.9(2008年8月27日)

特征

  • A repoze.bfg.location 添加了API模块。

向后不兼容

  • 应用程序现在必须使用 repoze.bfg.interfaces.ILocation 接口而不是 zope.location.interfaces.ILocation 表示模型对象是“位置感知”的。我们已经消除了对 zope.location 出于清洁的目的:随着Zope库的新版本发布,这些版本改进了依赖关系信息,从而消除了我们对 zope.location 将阻止新安装的repoze.bfg应用程序要求 zope.security ,egg,在“stock”repoze.bfg设置中根本没有真正使用。此时堆栈仍然需要这些依赖项;这纯粹是一个未来定位移动。

    以前版本的安全性和模型文档 repoze.bfg 建议使用 zope.location.interfaces.ILocation 接口来表示模型对象是“位置感知”的。此文档已更改,以反映此接口现在应该从 repoze.bfg.interfaces.ILocation 相反。

0.3.8(2008年8月26日)

文档

  • 以叙述的形式更好地记录URL分派。

错误修复

  • 路由URL调度没有访问wsgi环境的权限,因此method=get等条件不起作用。

特征

  • 添加 principals_allowed_by_permission 安全模块的API。

  • 替换 z3c.pt 支持与支持 chameleon.zpt . 变色龙是以前命名的包的新名称 z3c.pt . 注意:如果您更新了 repoze.bfg SVN签出您用于开发的,您需要再次运行“setup.py install”或“setup.py develop”,以获得正确的变色龙软件包。 z3c.pt 不再受支持 repoze.bfg . 用于呈现的所有API函数 z3c.pt 模板可以与新的包一起工作,并且模板的呈现应该几乎相同。

  • 添加 repoze.bfg.chameleon_zpt 模块。此模块提供变色龙ZPT支持。

  • 添加 repoze.bfg.xslt 模块。此模块提供XSLT支持。

  • 添加 repoze.bfg.chameleon_genshi 模块。这提供了以前不存在的直接Genshi支持。

废弃

  • 直接从导入API函数 repoze.bfg.template 现已弃用。这个 get_templaterender_templaterender_template_to_response 现在应该从导入函数 repoze.chameleon_zpt . 这个 render_transformrender_transform_to_response 现在应该从导入函数 repoze.bfg.xslt . 这个 repoze.bfg.template 模块将“永远”保留,以支持向后兼容性。

0.3.7(2008年9月9日)

特征

  • 添加与z3c.pt 1.0a7+的兼容性(z3c.pt成为命名空间包)。

错误修复

  • repoze.bfg.traversal.find_model 功能无法正常工作。

0.3.6(2008年9月4日)

特征

  • 添加启动过程文档。

  • 允许配置缓存被包含特殊“不可缓存”鉴别器的操作绕过(对于结果可变的操作)。

漏洞修补

  • 将core repoze.bfg zcml移动到 repoze.bfg.includes 包,以便更好地将repoze.bfg用作命名空间包。调整代码生成器以使用它。我们已经离开了 configure.zcml 在repoze.bfg包中直接使用,以免破坏旧的应用程序。

  • 当一个zcml应用程序注册表缓存被取消勾选,并且它包含对一个不再存在的对象(比如视图)的引用时,bfg将无法正常启动。

0.3.5(2008-09-01)

特征

  • 在创建和配置应用程序后发出事件通知 (IWSGIApplicationCreatedEvent

  • 新API模块: repoze.bfg.view . 此模块包含名为 render_view_to_responserender_view_to_iterablerender_viewis_response 在API文档中记录。这些特性有助于编程(非服务器驱动)视图的执行。

0.3.4(2008年8月28日)

向后不兼容

  • 制作 repoze.bfg 一个名称空间包,这样我们可以允许人们创建子包(例如 repoze.bfg.otherthing )在分开的鸡蛋里。这是一个向后不兼容的更改,因此无法从 repoze.bfg 模块直接。此更改将破坏由粘贴代码生成器生成的所有现有应用程序。相反,您需要将这些函数作为 repoze.bfg.router:make_apprepoze.bfg.registry:get_options ,分别。对不起,伙计们,这件事要么现在做,要么永远不做,现在肯定会更好。

特征

  • 添加 model_path 遍历模块的API函数。

错误修正

  • 规范化repoze.bfg.caller_path返回的路径。

0.3.3(2008年8月23日)

  • 修复生成的test.py模块以使用项目名称而不是包名称。

0.3.2(2008年8月23日)

  • 去除 sampleapp 来自bfg包本身的示例应用程序。

  • 移除对FormEncode的依赖(仅sampleApp需要)。

  • 修复粘贴器模板生成,以便保留项目与包名称的区分大小写。

  • 依靠 z3c.pt 版本1.0A1(需要 [lxml] 目前额外)。

  • 读取和写入一个pickled zcml操作列表,存储为 configure.zcml.cache 在应用程序的“正常”配置文件旁边。如果一个给定的bfg应用程序能够读取pickle数据,那么它的启动速度通常会更快。如果它不能读取pickle,那么它就无法优雅地读取真正的zcml文件。

0.3.1(2008年8月20日)

  • 生成的应用程序差异: make_app 入口点重命名为 app 为了有一个不同的名称,与bfg函数同名,以防混淆。

  • 将“选项”处理添加到BFG make_app 以支持运行时选项。名为 get_options 已添加到注册表模块。此函数通常用于应用程序的 app 入口点。应用程序的粘贴配置文件部分现在可以提供 reload_templates 选项,如果为真,将阻止重新启动AppServer z3c.pt 或检测到XSLT模板更改。

  • 只使用生成项目的“测试套件”中的模块名(运行包中找到的所有测试)。

  • 生成的应用程序的默认端口从5432更改为6543(Postgres默认端口为6543)。

0.3.0(2008-08-16)

  • 添加 get_template API到模板模块。

0.2.9(2008年8月11日)

  • 0.2.8是“棕色袋子”释放。根本不起作用。症状:试图呈现页面时出现componentLookuperError。

0.2.8(2008年8月11日)

  • 添加 find_modelfind_root 遍历API。在此过程中,将ITraverser设置为单适配器(上下文),而不是多适配器(上下文和请求)。

0.2.7(2008-08-05)

  • 添加 request_type 属性的可用属性 bfg:view 配置.zcml元素。这个属性将有一个值,该值是一个点式python路径,指向一个接口。如果请求对象在执行视图查找时实现此接口,则将调用相应的视图。这意味着允许基于请求类型对站点进行简单的“剥皮”。事件订阅服务器应将接口附加到入口请求以支持外观。

  • 删除“仅模板”视图。这些只是令人困惑,从未被记录在案。

  • 小URL调度检修: connect 方法 urldispatch.RoutesMapper 对象现在接受一个名为 context_factory . 如果提供此参数,则它必须是可调用的,返回实例。当路由匹配时,此实例用作请求的上下文。

  • RoutesModelTraverser的注册不再需要由应用程序执行;它现在在bfg zcml中。

0.2.6(2008年7月31日)

  • 为inewrequest和inewresponse添加事件发送。请参阅文档中的events.rst章节 api 目录。

0.2.5(2008年7月28日)

  • 添加 model_url 应用程序编程接口。

0.2.4(2008年7月27日)

  • 添加了基于URL的调度。

0.2.3(2008年7月20日)

  • 为已验证的用户ID和有效的主体添加API函数。

0.2.2(2008年7月20日)

  • 将已验证的u用户ID和有效的u主体API添加到安全策略中。

0.2.1(2008年7月20日)

  • 添加find_接口API。

0.2(2008年7月19日)

  • 添加wsgiapp decorator。

  • “视图工厂”的概念被删除,取而代之的是始终调用一个视图,它是一个可调用的,直接返回响应(而不是返回一个视图)。因此, factory bfg:view zcml语句中的属性已重命名为 view . 还更改了各种接口名称。

  • render_templaterender_transform 不再返回响应对象。相反,这些返回字符串。旧的行为可以通过使用 render_template_to_responserender_transform_to_response .

  • 添加了“repoze.bfg.push:pushpage”装饰符,它从接受(上下文、请求)并返回顶级名称映射的可调用文件创建bfg视图。

  • 添加了基于ACL的安全性。

  • 通过呈现转换方法支持XSLT模板

0.1(2008年7月8日)

  • 首次发布。