跳转到主要内容

为Zope2提供的子请求

项目描述

概述

plone.subrequest为Zope提供了发起子请求的机制。

安装

Plone 4+

此包包含在核心Plone中,因此不需要特殊安装。

Zope

以常规方式加载此包的ZCML。

用法

基本用法

调用subrequest(url),它返回一个响应对象。

>>> from plone.subrequest import subrequest
>>> response = subrequest('/folder1/@@url')
>>> response.getBody()
b'http://nohost/folder1'

response.getBody()也适用于调用response.write(data)的代码。这返回一个文本/非字节值。

>>> response = subrequest('/@@response-write')
>>> response.getBody()
'Some data.\nSome more data.\n'

但在此情况下,response.getBody()可能只能调用一次。

>>> response.getBody()
Traceback (most recent call last):
    ...
ValueError: I/O operation on closed file

将响应体作为文件访问

某些代码可能调用response.write(data)

>>> response = subrequest('/@@response-write')

在这种情况下,你可以将response.stdout作为文件访问。

>>> response.stdout.seek(0, 0) or 0  # Py2 returns None, Py3 returns new position
0
>>> list(response.stdout)
['Some data.\n', 'Some more data.\n']

你可以使用response._wrote测试是否返回了文件。

>>> response._wrote
1

完成时,关闭文件

>>> response.stdout.close()

使用response.outputBody()确保可以以文件的方式访问体。

>>> from plone.subrequest import subrequest
>>> response = subrequest('/folder1/@@url')
>>> response._wrote
>>> response.outputBody()
>>> response._wrote
1
>>> response.stdout.seek(0, 0) or 0  # Py2 returns None, Py3 returns new position
0
>>> list(response.stdout)
['http://nohost/folder1']

相对路径

相对路径相对于父请求的位置解析

>>> from plone.subrequest.tests import traverse
>>> request = traverse('/folder1/@@test')
>>> response = subrequest('folder1A/@@url')
>>> response.getBody()
b'http://nohost/folder1/folder1A'

这考虑了默认视图的URL。

>>> request = traverse('/folder1')
>>> request['URL'] == 'http://nohost/folder1/@@test'
True
>>> response = subrequest('folder1A/@@url')
>>> response.getBody()
b'http://nohost/folder1/folder1A'

虚拟主机

当使用虚拟主机时,绝对路径从虚拟主机根目录遍历。

>>> request = traverse('/VirtualHostBase/http/nohost:80/folder1/VirtualHostRoot/')
>>> response = subrequest('/folder1A/@@url')
>>> response.getBody()
b'http://nohost/folder1A'

指定根目录

你也可以显式设置根对象

>>> app = layer['app']
>>> response = subrequest('/folder1A/@@url', root=app.folder1)
>>> response.getBody()
b'http://nohost/folder1/folder1A'

错误响应

可能找不到子请求。

>>> response = subrequest('/not-found')
>>> response.status
404

或者可能引发错误。

>>> response = subrequest('/@@error')
>>> response.status
500

或者可能引发由自定义错误视图渲染的错误。

>>> response = subrequest('/@@custom-error')
>>> response.status
500
>>> response.body
b'Custom exception occurred: A custom error'

因此,检查期望的状态。

>>> response = subrequest('/')
>>> response.status == 200
True

处理子请求

父请求被设置为PARENT_REQUEST到子请求。

子请求还提供了plone.subrequest.interfaces.ISubRequest标记接口。

变更日志

2.0.5 (2024-01-22)

内部

  • 更新配置文件。[plone开发者] (cfffba8c)

2.0.4 (2023-06-09)

内部

  • 更新配置文件。[plone开发者] (b5084eff)

2.0.3 (2023-03-14)

内部

  • 更新配置文件。[plone开发者] (13d8d6c0)

2.0.2 (2023-02-07)

错误修复

  • 将依赖项声明为z3c.dependencychecker找到的。[gforcada] (#1)

2.0.1 (2023-01-27)

内部

  • 通过github.com/plone/meta统一存储库配置。[gforcada, maurits] (#1)

2.0.0 (2022-11-30)

错误修复

  • 最终发布。[gforcada] (#600)

2.0.0b1 (2022-09-07)

破坏性更改

  • 停止Python 2支持并更新代码风格。[jensens] (#25)

1.9.3 (2020-09-26)

错误修复

  • 修复了对zope.site.hooks的弃用警告。[maurits] (#24)

1.9.2 (2020-04-22)

错误修复

  • 微小的包装更新。(#1)

1.9.1 (2019-04-29)

错误修复

  • 修复回归错误,在Python 2.7中,当tiles包含非ascii字符时会导致破坏。[MrTango] (#22)

1.9.0 (2018-12-11)

破坏性更改

  • 删除five.globalrequest依赖项。它已在Zope 4中弃用。[gforcada]

1.8.6 (2018-09-23)

新功能

  • 修复没有ZServer的importsi。[pbauer]

错误修复

  • 更多Python 3兼容性。[ale-rt, thet]

  • 使测试依赖项Archetypes可选。[davisagli]

1.8.5 (2018-01-30)

错误修复

  • 添加Python 2 / 3兼容性。[pbauer]

1.8.4 (2017-09-06)

新功能

  • 添加对Zope异常视图的支持,当未定义显式异常处理程序时。[datakurre]

错误修复

  • 修复了示例unauthorized_exception_handler未能正确设置响应状态代码的问题。[datakurre]

1.8.3 (2017-08-30)

错误修复

  • 撤销“从路径中删除vurl-parts”,这导致了p.a.mosaic页面的破坏。[thet]

1.8.2 (2017-07-20)

错误修复

  • 从路径中删除vurl-parts。[awello]

1.8.1 (2017-06-28)

错误修复

  • 删除unittest2依赖项。[kakshay21]

1.8 (2016-11-01)

新功能

  • 提供将Unauthorized重写为401的异常处理器。[jensens]

1.7.0 (2016-05-04)

新功能

  • 允许为响应传递自定义异常处理器。[jensens]

修复

  • 当子请求修改了数据库(或子请求之前的主要请求)时,分配给请求的oids在每个后续子请求中都会加倍。这在使用大量子请求时导致内存不足错误,例如在基于Mosaic的站点上使用一定数量的tiles时。通过只添加父请求已知的oids来解决,而不是添加新的oids。[jensens]

  • 整理:isort导入,autopep8,小手动清理(无zope.app.导入)。[jensens]

1.6.11 (2015-09-07)

  • 在子请求上传播IDisableCSRFProtection接口到父请求对象。[vangheem]

1.6.10 (2015-08-14)

  • 从plone.protect传播已注册的安全写入到父请求对象。[vangheem]

1.6.9 (2015-03-21)

  • 针对上游包缺少依赖声明导致测试失败的处理方案,详情请见 https://github.com/plone/plone.app.blob/issues/19。 [jensens]

  • 整理和维护代码(pep8等)。 [jensens]

  • 修复主请求的response中新的cookies未传递给子请求的问题。 [datakurre]

  • 标准化request的path_info,以确保字符串索引可以正常工作。 [gweiss]

1.6.8 (2014-03-04)

  • 处理路径中包含双//的子请求。 [gweis]

1.6.7 (2012-10-22)

  • 确保正确处理裸虚拟托管URL。 [elro]

1.6.6 (2012-06-29)

  • 记录处理子请求时发生的错误,以帮助调试plone.app.theming错误,包括来自不同URL的内容 [anthonygerrard]

1.6.5 (2012-04-15)

  • 确保父URL是一个字符串而不是Unicode。 [davisagli]

1.6.4 - 2012-03-22

  • 修复由于复制过多其他变量而导致某些Unicode字符双重编码的问题。 [elro]

1.6.3 - 2012-02-12

  • 将其他请求变量(如LANGUAGE)复制到子请求。 [elro]

1.6.2 - 2011-07-04

1.6.1 - 2011-07-04

  • 将测试移动到包目录,以便在正常安装时进行测试。

1.6 - 2011-06-06

  • 确保URL是一个字符串而不是Unicode。 [elro]

1.6b2 - 2011-05-20

  • 设置PARENT_REQUEST并在子请求中添加ISubRequest接口。 [elro]

1.6b1 - 2011-02-11

  • 处理IStreamIterator。 [elro]

  • 简化API,使response.getBody()始终有效。 [elro]

1.5 - 2010-11-26

  • 将子请求响应中的cookies合并到父响应中。 [awello]

1.4 - 2010-11-10

  • 首先处理processInput,然后遍历(修复#11254) [awello]

1.3 - 2010-08-24

  • 修复虚拟主机和引号路径的bug。 [elro]

1.2 - 2010-08-16

  • 在子请求后恢复zope.component站点。 [elro]

1.1 - 2010-08-14

  • 虚拟主机、相对URL和错误响应支持。 [elro]

1.0 - 2010-07-28

  • 初始发布。 [elro]

项目详情


下载文件

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

源分发

plone.subrequest-2.0.5.tar.gz (25.9 kB 查看哈希值)

上传时间

构建分发

plone.subrequest-2.0.5-py3-none-any.whl (14.6 kB 查看哈希值)

上传于 Python 3

支持者