Subrequests for Zope2
plone.subrequest provides a mechanism for issuing subrequests under Zope2.
An entry point is provided so no special installation is required past adding plone.subrequest to your instance’s eggs.
Zope 2.12 without Plone
Load this package’s ZCML in the usual manner.
You must install ZPublisherEventsBackport to use this package with Zope 2.10 and load both package’s ZCML. The tests require Zope 2.12 / Python 2.6 so will not run.
Call subrequest(url), it returns a response object.
>>> from plone.subrequest import subrequest >>> response = subrequest('/folder1/@@url') >>> response.getBody() b'http://nohost/folder1'
response.getBody() also works for code that calls response.write(data). This one returns a text/non-byte value.
>>> response = subrequest('/@@response-write') >>> response.getBody() 'Some data.\nSome more data.\n'
But in this case response.getBody() may only be called once.
>>> response.getBody() Traceback (most recent call last): ... ValueError: I/O operation on closed file
Accessing the response body as a file
Some code may call response.write(data).
>>> response = subrequest('/@@response-write')
In which case you may access response.stdout as file.
>>> 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']
You can test whether a file was returned using response._wrote.
>>> response._wrote 1
When you’re done, close the file:
Use response.outputBody() to ensure the body may be accessed as a file.
>>> 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']
Relative paths are resolved relative to the parent request’s location:
>>> from plone.subrequest.tests import traverse >>> request = traverse('/folder1/@@test') >>> response = subrequest('folder1A/@@url') >>> response.getBody() b'http://nohost/folder1/folder1A'
This takes account of default view’s url.
>>> request = traverse('/folder1') >>> request['URL'] == 'http://nohost/folder1/@@test' True >>> response = subrequest('folder1A/@@url') >>> response.getBody() b'http://nohost/folder1/folder1A'
When virtual hosting is used, absolute paths are traversed from the virtual host root.
>>> request = traverse('/VirtualHostBase/http/nohost:80/folder1/VirtualHostRoot/') >>> response = subrequest('/folder1A/@@url') >>> response.getBody() b'http://nohost/folder1A'
Specifying the root
You may also set the root object explicitly
>>> app = layer['app'] >>> response = subrequest('/folder1A/@@url', root=app.folder1) >>> response.getBody() b'http://nohost/folder1/folder1A'
Subrequests may not be found.
>>> response = subrequest('/not-found') >>> response.status 404
Or might raise an error.
>>> response = subrequest('/@@error') >>> response.status 500
Or might raise an error rendered by a custom error view.
>>> response = subrequest('/@@custom-error') >>> response.status 500 >>> response.body b'Custom exception occurred: A custom error'
So check for the expected status.
>>> response = subrequest('/') >>> response.status == 200 True
The parent request is set as PARENT_REQUEST onto subrequests.
Subrequests also provide the plone.subrequest.interfaces.ISubRequest marker interface.
- Remove five.globalrequest dependency. It has been deprecated upstream (on Zope 4). [gforcada]
- Fix importsi without ZServer [pbauer]
- More Python 3 compatibility. [ale-rt, thet]
- Make test dependency on Archetypes optional. [davisagli]
- Add Python 2 / 3 compatibility [pbauer]
- Add support for Zope exception views when explicit exception handler is not defined [datakurre]
- Fix issue where the example unauthorized_exception_handler did not properly set response status code [datakurre]
- Reverted “Remove vurl-parts from path”, which resulted in broken p.a.mosaic pages [thet]
- Remove vurl-parts from path [awello]
- Remove unittest2 dependency [kakshay21]
- Provide an exception-handler for rewriting Unauthorized to 401’s. [jensens]
- Allow to pass a custom exception handler for the response. [jensens]
- When a subrequest modified the DB (or prior to the subrequest the main request), the oids annotated to the requests were doubled with each subsequent subrequest. This resulted in out-of-memory errors when using lots of subrequests, such as it happens on Mosaic based sites with a certain amount of tiles. Fixed by only adding new oids, not already known by parent request. [jensens]
- Housekeeping: isort imports, autopep8, minor manual cleanup (no zope.app. imports). [jensens]
- propagate IDisableCSRFProtection interface on subrequest to parent request object [vangheem]
- propagate registered safe writes from plone.protect to parent request object. [vangheem]
- Workaround for broken test because of missing dependency declaration in upstream package, see https://github.com/plone/plone.app.blob/issues/19 for details. [jensens]
- Housekeeping and code cleanup (pep8, et al). [jensens]
- Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre]
- normalise request path_info so that string indexing works properly. [gweiss]
- Handle sub-requests which contain a doubled // in the path. [gweis]
- Ensure correct handling of bare virtual hosting urls. [elro]
- Log errors that occur handling a subrequest to help debug plone.app.theming errors including content from a different url [anthonygerrard]
- Ensure parent url is a string and not unicode. [davisagli]
1.6.4 - 2012-03-22
- Fix problems with double encoding some unicode charse by not copying too many other variables. [elro]
1.6.3 - 2012-02-12
- Copy other request variables such as LANGUAGE to subrequest. [elro]
1.6.2 - 2011-07-04
- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278
1.6.1 - 2011-07-04
- Move tests to package directory to making testing possible when installed normally.
1.6 - 2011-06-06
- Ensure url is a string and not unicode. [elro]
1.6b2 - 2011-05-20
- Set PARENT_REQUEST and add ISubRequest interface to subrequests. [elro]
1.6b1 - 2011-02-11
- Handle IStreamIterator. [elro]
- Simplify API so response.getBody() always works. [elro]
1.5 - 2010-11-26
- Merge cookies from subrequest response into parent response. [awello]
1.4 - 2010-11-10
- First processInput, then traverse (fixes #11254) [awello]
1.3 - 2010-08-24
- Fixed bug with virtual hosting and quoted paths. [elro]
1.2 - 2010-08-16
- Restore zope.component site after subrequest. [elro]
1.1 - 2010-08-14
- Virtual hosting, relative url and error response support. [elro]
1.0 - 2010-07-28
- Initial release. [elro]
Release history Release notifications
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
|Filename, size & hash SHA256 hash help||File type||Python version||Upload date|
|plone.subrequest-1.9.0-py3-none-any.whl (15.3 kB) Copy SHA256 hash SHA256||Wheel||py3|
|plone.subrequest-1.9.0.tar.gz (20.7 kB) Copy SHA256 hash SHA256||Source||None|