跳转到主要内容

对Zope 2的WSGI支持

项目描述

infrae.wsgi 提供了运行Zope 2作为WSGI应用程序的支持。

简介

它基本上与

  • repoze.zope2,

  • Zope 2新的内置WSGI发布者。

不同之处在于

  • 它与真正的Zope 2应用程序一起工作,而无需猴子补丁,

  • 它特别关注正确实现流式传输。您可以在流式传输时使用您的ZODB连接,(无论是使用请求的.write方法,还是返回一个IResult或一个IStreamIterator迭代器)。如果流式传输操作期间发生ConflictError,则生成最终错误,不会在同一个HTTP连接上重新发送内容,

  • 所有ConflictError都得到妥善管理。

  • 所有这些情况都已进行测试。

它不提供

  • Zope 2作为一组WSGI中间件,因为Zope 2范式/代码库不适合这样做,

  • 执行所有旧 Zope 2 发布者所做的复杂请求体更改,因为很长时间以来没有人使用它了。

错误

错误信息在传统 Zope 2 中的处理方式略有不同,以便使事情更简单。

它们是错误视图(称为 error.html),并围绕它们发生的上下文进行获取包装

from five import grok

class CorpError(Exception):
    """Custom corporate error.
    """

class CorpErrorMessage(grok.View):
    grok.context(CorpError)
    grok.name('error.html')

    def render(self):
        # aq_parent(self) is where the error happened
        return u'I Failed: %s' % str(self.error.args)

错误会记录有用的信息

  • 这是触发此错误的 URL,

  • 用户代理,

  • 引用,

  • 登录的用户名,

  • 在哪个对象上,如果可能,其物理路径和元类型。

错误日志可以通过 /errorlog.html 在任何 Zope 2 内容中在线访问。

错误还可以发送到 Sentry 服务(参见 Paste Deploy 部分)。

默认情况下,错误日志会忽略某些错误:NotFound、Redirect、Unauthorized、Forbidden、BadRequest、BrokenReferenceError。errlog.html 页面有一个表单来配置(或全部)这些错误不被忽略。这不是一个持久设置,在重启时会忘记。

安装

infrae.wsgi 已经与 Paste Deploy、mod_wsginginx 部署。它正确遵守 WSGI 规范,应该与任何 WSGI 服务器一起工作。

Paste Deploy

应用程序可以通过 infrae.wsgi#zope2 的入口点使用。

它期望一个名为 zope_conf 的选项变量,该变量指向 Zope 2 配置文件。

还可以指定 debug_mode 选项,以在调试模式下运行 Zope。在调试模式下,Zope 不会渲染错误页面,错误将传播到 WSGI 栈中。这种行为将允许您使用专业的中间件调试错误。

要禁用调试模式中的错误传播,可以将 debug_exceptions 选项设置为 off

可以使用 zope_workers 选项来指定 Zope 应该允许同时处理请求的最大线程数(默认为 4)。如果您希望允许 WSGI 环境中有更多线程,这可能会很有用,例如,如果您有中间件或其他应用程序,它们拦截请求并支持比 Zope 更多的线程。

show_errors 选项接受一个以逗号分隔的错误列表,这些错误将不会忽略。这会覆盖默认忽略的错误列表(参见上面的错误部分)

ignore_errors 选项接受一个以逗号分隔的错误列表,这些错误将被忽略。这也覆盖了默认忽略的错误列表。

配置接受 Raven(Sentry 的客户端)的选项

raven.dsn = http://public:secret@example.com/1
raven.include_paths = my.package, my.other.package
raven.exclude_paths = my.package.crud

这些选项需要安装 Raven

虚拟托管

您可以在代理中添加两个头,以控制虚拟主机

  • X-VHM-URL:这将是在您想要看到 Zope 应用程序的网站上的完整 URL,例如 http://www.mysite.com/application

  • X-VHM-Path:这将是一个可选路径,您可以在给定的 URL 上看到 Zope 文件夹而不是 Zope 根目录,例如 /my/folder

测试

可以从 infrae.wsgi.testing 中导入测试请求 TestRequest。它与 Zope 使用的请求行为完全相同。创建它时,它接受以下参数

application

用于请求的 WSGI 应用程序。

layers

应用于请求的 Zope 层。

url

用于请求的 URL。

method

请求中使用的HTTP方法。

头部

与请求一起发送的HTTP头部。

调试

请求是否应在调试模式下运行。

表单

与请求关联的表单数据。

功能测试

一个继承自infrae.testing Zope2Layer层的层,称为ZopeBrowserLayer,允许您编写功能测试。

它提供了http函数和一个ZopeBrowser类(类似于zope.testbrowser提供的类),您可以使用这些函数和类,并且它们将通过该软件包提供的WSGI支持连接到测试应用程序。

这将允许您进行功能测试,并且事情将像在浏览器中一样工作,因为请求将以与现实生活中相同的方式进行处理(这与Zope 2的Testing模块的情况并不相同)。

您实际上能够测试使用流的应用程序

import unittest

from infrae.wsgi.testing import ZopeBrowser, ZopeBrowserLayer
import corp.testpackage


class CorpTestCase(unittest.TestCase):
   layer = BrowserLayer(corp.testpackage)

   def setUp(self):
       self.root = self.layer.get_application()
       # Create some test content

   def test_feature(self):
       browser = ZopeBrowser()
       browser.open('http://localhost/somepage')
       self.assertEqual(browser.status, 200)
       ...

此功能由wsgi_intercept提供。只有当wsgi_intercept包含在环境中时,此功能才可用。

变更

2.2.1 (2013-10-08)

  • 修复了错误消息日志工具中的UnicodeError。

2.2 (2013-06-22)

  • 通过raven改进了日志记录:使用注释跟踪的消息太长。

  • 修复了即使定义了Content-Length,也会设置的HTTP状态代码204。

  • 修复了当多个挂载点尚不存在时paster启动崩溃的问题。

  • wsgi_intercept支持现在是测试的可选功能。有一个简单的测试层BrowserLayer,它提供了一个不带该功能的测试WSGI应用程序。具有该支持的层和浏览器已使用Zope前缀。为了启用此功能,您必须依赖功能[intercept]

2.1 (2012-12-10)

  • 在paster中,可以通过将debug_exceptions设置为off来禁用堆栈中错误的传播。如果激活了debug_mode,则此选项才有作用。

  • 在paster中,可以通过show_errorsignore_errors这两个选项自定义在日志中忽略的默认错误列表。

  • 添加了一个插件来记录Sentry中的错误(这需要安装raven)。

2.0.1 (2012-09-19)

  • 添加了一个可选的WSGI中间件,它可以显示与debugzope.html相同的调试信息。

  • 添加了一个在渲染错误页面之前触发的事件。

  • 如果错误视图实现了IBrowserPublisher,则调用browserDefault以获取要渲染的实际视图。

2.0 (2012-09-04)

  • 将Zope 2 BaseRequest中的虚拟托管、遍历和认证代码重构为三段不同的代码,可以自定义。这使得可以更改认证或虚拟托管的方式。

  • 添加了一个可用于测试的TestRequest。这与zope.publisher测试请求相同,但它基于Zope 2请求,并且具有与Zope 2请求相同的行为。

  • 添加了一个可配置的信号量,以限制可以访问Zope 2应用程序的并发线程数。当您有处理请求的中间件时,这很有用,因为它们不受Zope 2对线程数限制的影响。

1.3 (2011-07-27)

  • 改进了日志记录。

  • 默认情况下,现在在日志中忽略BadRequest和Forbidden异常。

  • 修复了原始CONTENT_LENGTH头部为空的问题。

  • 当IBrowserPage发生错误时,在处理错误时使用页面的上下文(以防止回退到最近的站点)。

1.2 (2011-02-02)

  • 添加一个视图 debugzope.html,用于显示服务器线程的转储。您需要是管理员才能访问。

  • 您可以从 errorlog.html 配置要忽略的错误(不记录)。这是一个非持久设置。

  • 通过捕获任何错误并记录它们来处理存在问题的PAS未授权插件。在出现问题时,将发送一个基本的401响应。

  • 添加ZPublisher insertBase 功能:如果请求设置了基本(base),并且我们渲染HTML,带有HEAD标签但没有BASE标签,则插入一个由请求提供的值的BASE标签。此修复了损坏的ZMI屏幕。

1.1 (2010-10-07)

  • 修复了无法设置和无法设置 Content-Length 的错误。

  • 在发送之前,根据需要正确编码负载(如果它是Unicode字符串)。

  • 当500错误触发提交时,减少错误代码,这让您能够支持使用Zope会话ID的登录页面。

  • 在测试代码中添加一些钩子以使其更具扩展性(用于 infrae.testbrowser)。

1.0 (2010-07-15)

  • 初始发布。

项目详情


下载文件

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

源分布

infrae.wsgi-2.2.1.tar.gz (38.7 kB 查看散列)

上传时间

由以下机构支持

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