对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_wsgi 和 nginx 部署。它正确遵守 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_errors和ignore_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 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | f4429497afa00db8819bc2c96e1d29cc635a11e85b65afb140369e085d99c6e6 |
|
MD5 | 0ff89f7fec1c4aad4fad67f6fcbbcca9 |
|
BLAKE2b-256 | eb417bfc9920dfab506900655016ceec8328ecfd8d53f5624fc9a9e63d00069d |