跳转到主要内容

Zope 3的Pagelet层配置

项目描述

Latest Version Supported Python versions Build Status Code Coverage

此软件包为Zope3提供了一个基于Pagelet的层配置。

Zope 3的Pagelet层

此软件包包含Pagelet层。此层支持一组正确的组件注册,并可用于自定义皮肤的继承。

目前Zope3中的默认实现具有不同的遍历概念限制,并在默认层上使用过多的注册。

重要

此层基于Pagelet模式。这意味着每个页面,例如错误页面,都是基于Pagelet概念的。

IPageletBrowserLayer

Pagelet层对于构建自定义呈现皮肤非常有用,无需访问ZMI菜单,如zmi_views等。这意味着如果您使用此层,则不会注册菜单项。

此层不是从 IDefaultBrowserLayer 层派生而来。因此,它只提供了最基本的最重要的公共视图,例如 @@absolute_url,这些视图在 zope 包中注册给 IHTTPRequest 和 IBrowserRequest。除了这些视图之外,该包还将仅提供错误视图和遍历器,这些通常在以下 zope 包中注册:

  • zope.app.http.exception

  • zope.app.publication

  • zope.browserresource

  • zope.traversing

注意,此包不依赖于上述所有包。我们只需要依赖此包将定义视图和遍历器的相同接口。

测试

为了测试 IPageletBrowserLayer 层,我们使用在测试包中定义的测试皮肤,该皮肤使用 IPageletBrowserLayer 层作为唯一的基本层。这意味着,我们的测试皮肤只提供最小包中定义的视图以及测试中定义的测试视图。

首先以管理员的身份登录

>>> from webtest.app import TestApp
>>> manager = TestApp(
...     make_wsgi_app(), extra_environ={
...         'wsgi.handleErrors': False,
...         'HTTP_AUTHORIZATION': 'Basic mgr:mgrpw'})

检查我们是否可以通过我们的皮肤访问在 ftesting.zcml 文件中注册的 page.html 视图

>>> skinURL = 'https://127.0.0.1/++skin++PageletTestSkin'
>>> res = manager.get(skinURL + '/page.html')
>>> res.request.url
'https://127.0.0.1/++skin++PageletTestSkin/page.html'
>>> print(res.html)
<!DOCTYPE...
<html ...>
<head>
<title>PageletTestLayout</title>
</head>
<body>
  test page
<BLANKLINE>
</body>
</html>
<BLANKLINE>

未找到

现在检查未找到页面,这是一个在异常 zope.publisher.interfaces.INotFound 上的异常视图

>>> err_manager = TestApp(
...     make_wsgi_app(), extra_environ={
...         'HTTP_AUTHORIZATION': 'Basic mgr:mgrpw'})
>>> res = err_manager.get(skinURL + '/foobar.html', status=404)
>>> print(res.html)
<!DOCTYPE...
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PageletTestLayout</title>
</head>
<body>
  <div>
  <br/>
  <br/>
  <h3>
    The page you are trying to access is not available
  </h3>
  <br/>
  <b>
    Please try the following:
  </b>
  <br/>
  <ol>
    <li>
      Make sure that the Web site address is spelled correctly.
    </li>
    <li>
      <a href="javascript:history.back(1);">
        Go back and try another URL.
      </a>
    </li>
  </ol>
</div>
<BLANKLINE>
</body>
</html>
<BLANKLINE>

用户错误

并检查为 zope.exceptions.interfaces.IUserError 异常注册的用户错误页面

>>> manager.get(skinURL + '/@@usererror.html')
Traceback (most recent call last):
...
zope.exceptions.interfaces.UserError: simply user error
>>> res = err_manager.get(skinURL + '/@@usererror.html')
>>> print(res.html)
<!DOCTYPE ...
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PageletTestLayout</title>
</head>
<body>
  <div>
  <div>simply user error</div>
</div>
<BLANKLINE>
</body>
</html>
<BLANKLINE>

常见异常(系统错误)

并检查为 zope.interface.common.interfaces.IException 注册的错误视图,如果在测试期间调用或在开发模式下打开,它将设置 HTTP 状态码为 500

>>> res = manager.get(skinURL + '/@@systemerror.html')
Traceback (most recent call last):
...
Exception: simply system error
>>> res = err_manager.get(skinURL + '/@@systemerror.html', status=500)
>>> print(res.html)
<!DOCTYPE...
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PageletTestLayout</title>
</head>
<body>
  <div>
  <br/>
  <br/>
  <h3>A system error occurred</h3>
  <br/>
  <b>Please contact the administrator.</b>
  <a href="javascript:history.back(1);">
    Go back and try another URL.
  </a>
</div>
<BLANKLINE>
</body>
</html>
<BLANKLINE>

未经授权

要检查 zope.security.interfaces.IUnauthorized 视图,我们使用一个新的未注册用户(测试浏览器)。由于我们在 ZCML 中定义了 unauthenticatedPrincipal(见 tests/ftesting.zcml),因此返回 401 Unauthorized 而不是 403 Forbidden(否则将会显示)

>>> unauthorized = TestApp(make_wsgi_app())
>>> res = unauthorized.get(skinURL + '/@@forbidden.html', status=401)
>>> print(res.html)
<!DOCTYPE ...
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PageletTestLayout</title>
</head>
<body>
  <div>
  <br/>
  <br/>
  <h3>Unauthorized</h3>
  <br/>
  <b>You are not authorized.</b>
</div>
</body>
</html>

禁止

当授权用户尝试访问他没有足够权限的 URL 时,他会得到一个 403 Forbidden,显示的页面内容与 401 Unauthorized 相同。当注册身份验证实用工具时,它可能会显示登录表单

>>> authorized = TestApp(
...     make_wsgi_app(), extra_environ={
...         'HTTP_AUTHORIZATION': 'Basic mgr:mgrpw'})
>>> res = authorized.get(skinURL + '/@@forbidden.html', status=403)
>>> print(res.html)
<!DOCTYPE ...
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PageletTestLayout</title>
</head>
<body>
  <div>
  <br/>
  <br/>
  <h3>Unauthorized</h3>
  <br/>
  <b>You are not authorized.</b>
</div>
</body>
</html>

变更记录

3.0 (2023-02-17)

  • 添加对 Python 3.8、3.9、3.10、3.11 的支持。

  • 取消对 Python 2.7、3.4、3.5、3.6 的支持。

2.1 (2018-12-01)

  • 添加对 Python 3.5 到 3.7 的支持。

  • 取消对 Python 2.6 和 3.3 的支持。

  • 取消使用 python setup.py test 运行测试的能力。

2.0.0 (2015-11-09)

  • 标准化命名空间 __init__。

  • 声明对 Python 3.4 的支持。

2.0.0a1 (2013-03-03)

  • 添加了对 Python 3.3 的支持。

  • 由于 zope.testbrowser 尚未移植,将 zope.testbrowser 测试更改为 WebTest

  • 用等效的 zope.interface.implementer 装饰器替换了已弃用的 zope.interface.implements 使用。

  • 取消对 Python 2.4 和 2.5 的支持。

1.10.1 (2012-03-03)

  • IPageletBrowserLayer 添加了对 zope.browserresource.interfaces.IETag 接口的适配器注册,使其在 IPageletBrowserLayer 上可用。此适配器对于提供文件资源是必要的。

1.10.0 (2012-02-23)

  • 在系统错误时设置 HTTP 状态码为 500,但仅在 devmode 和测试中。

1.9.0 (2010-10-13)

  • 作为 1.8.1 中的更改需要新的大版本发布,因为它破坏了 z3c.authviewlet,因此重新发布 1.8.1。

1.8.2 (2010-10-13)

  • 由于 1.8.1 中的更改需要新的大版本发布,因为它破坏了 z3c.authviewlet,因此重新发布 1.8.0。

1.8.1 (2010-10-11)

  • 现在在 UnauthorizedPageletupdate 方法中而不是在 render 方法中执行重定向,这样在重定向时不会渲染布局模板。

  • 修复了测试:使用管理员账户,这样匿名用户不需要获得所有权限才能成功运行测试。

  • 通过使用 zope.app.wsgi 摆脱了 zope.app.testing 测试依赖。

  • 摆脱了 zope.app.authentication 测试依赖。

  • 添加了对 403 禁止访问 的测试。

1.8.0 (2010-08-20)

  • 需要 zope.login,以便测试在 zope.publisher >= 3.12 下运行。

1.7.0 (2009-12-24)

  • 将 i18n 区域添加到模板中,以便进行翻译。(使用 z3c.locales 完成。)

1.6.1 (2009-12-23)

  • zope.browserresource 从测试依赖项移至安装依赖项,因为它在 ZCML 配置中是必需的。

1.6.0 (2009-11-30)

  • zope.publisher.interfaces.ITraversalException 的视图从系统错误页面组件更改为未找到页面组件。

  • 将身份验证视图组件移动到 z3c.authviewlet

  • 清理了依赖关系,反映了 zope 包中的更改。

  • 清理了测试依赖关系。

1.5.0 (2009-05-28)

  • 通过使用 zope.browser>=1.2 并直接实现异常视图类,而不是继承它们(在这里几乎没有使用基类),移除了对 zope.app.exception 的依赖。

  • 移除了对 zope.app.twisted 的不必要的测试依赖。

  • 移除了对 zope.app.component 的不再需要的测试依赖。

1.4.0 (2009-03-16)

  • 通过使用新的包 zope.authenticationzope.principalregistry 来移除对 zope.app.security 的直接依赖。

  • 移除了对 zope.app.zcmlfiles 的不需要的测试依赖。

  • setup.py 中修复了命名空间包声明。

1.3.0 (2009-03-13)

  • 实现了使用页面组件或视图组件的登录和注销。

  • 更新了测试,以使用包含排除指令的新 zope.configuration

1.2.1 (2009-02-21)

  • 版本 1.2.0 缺少了安全问题的测试文件。

1.2.0 (2009-02-21)

  • 安全问题:IPageletBrowserLayer 定义的遍历器是一个可信的适配器,因此安全代理从每个遍历的对象中删除。因此,所有子对象都可以公开访问。

1.1.0 (2009-02-14)

  • 错误修复:使用 IContentTemplate 而不是 IPageTemplate,以避免在没有注册 IPageTemplate 的情况下获取布局模板。

  • 使用 zope.location.interfaces.ISite 而不是 zope.app.component.interfaces.ISite

  • 使用 zope.container 而不是 zope.app.container

  • 清理了依赖关系。

1.0.2 (2009-04-03)

  • 回溯发布,请参阅发布日期

  • 安全问题:IPageletBrowserLayer 定义的遍历器是一个可信的适配器,因此安全代理从每个遍历的对象中删除。因此,所有子对象都可以公开访问。

    进行此更改可能会破坏您的应用程序!这意味着如果安全声明不当。

  • 错误修复:使用 IContentTemplate 而不是 IPageTemplate,以避免在没有注册 IPageTemplate 的情况下获取布局模板

1.0.1 (2008-01-24)

  • 错误:更新元数据。

1.0.0 (2008-01-21)

  • 重构:将 z3c.layer.pagelet 包从 z3c.layer 移动到其自己的顶级包 z3c.layer.pagelet

  • 重构:从页面组件层中移除了对 zope.app.form 的支持。

0.2.3 (2007-11-07)

  • 前向错误:由于 mechanize 中的错误,testbrowser 抛出 httperror_seek_wrapper 而不是 HTTPError 错误。感谢 RE normalizers,代码现在将正常工作,无论该错误是否在 mechanize 中修复。

0.2.2 (2007-10-31)

  • 错误:修复了包元数据。

  • 错误:修复了由于依赖关系更新导致的测试失败。

  • 重构:修复了对 ZopeSecurityPolicy 的弃用警告。

0.2.1 (2007-??-??)

  • 更改未知。

0.2.0 (2007-??-??)

  • 初始发布。

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

z3c.layer.pagelet-3.0.tar.gz (20.6 kB 查看哈希值)

上传时间

构建分布

z3c.layer.pagelet-3.0-py3-none-any.whl (23.0 kB 查看哈希值)

上传时间 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面