Skip to main content

Hook into repoze.zope2 that allows third party packages to register a sequence of hooks that will be allowed to modify the response before it is returned to the browser

Project description

Introduction

plone.transformchain provides methods to modify the response from a page published with repoze.zope2 or the “classic” ZPublisher before it is returned to the browser.

Register a uniquely named adapter from (published, request) providing the ITransform interface. published is the published object, e.g. a view; request is the current request.

The order of the transforms can be maintained using the order property of the adapter.

One of three methods will be called, depending on what type of input was obtained from the publisher and/or the previous method.

  • transformBytes() is called if the input is a str (bytes) object

  • transformUnicode() is called if the input is a unicode object

  • transformIterable() is called if the input is another type of iterable

Each stage can return a byte string, a unicode string, or an iterable.

Most transformers will have a “natural” representation of the result, and will implement the respective method to return another value of the same representation, e.g. implement transformUnicode() to transform and return a unicode object. The other methods may then either be implemented to return None (do nothing) or convert the value to the appropriate type.

The first transformer in the chain is likely to get:

  • A byte string if the transformer is running under the standard Zope 2 ZPublisher.

  • An iterable if the transformer is running under repoze.zope2 or another WSGI pipeline.

Check self.request.response.getHeader('content-type') to see the type of result. The iterable, when unwound, will conform to this type, e.g. for “text/html”, ''.join(result) should be an HTML string.

The return value is passed to the next transform in the chain. The final transform should return a unicode string, an encoded string, or an iterable.

If a byte string or unicode string is returned by the last transform in the chain, the Content-Length header will be automatically updated.

Return None to signal that the result should not be changed from the previous transform.

Here is an example that uppercases everything:

from zope.component import adapter
from zope.interface import implementer
from zope.interface import Interface
from plone.transformchain.interfaces import ITransform

@implementer(ITransform)
@adapter(Interface, Interface) # any context, any request
class UpperTransform(object):

    order = 1000

    def __init__(self, published, request):
        self.published = published
        self.request = request

    def transformBytes(self, result, encoding):
        return result.upper()

    def transformUnicode(self, result, encoding):
        return result.upper()

    def transformIterable(self, result, encoding):
        return [s.upper() for s in result]

You could register this in ZCML like so:

<adapter factory=".transforms.UpperTransform" name="example.uppertransform" />

If you need to turn off transformations for a particular request, you can set a key in request.environ:

request.environ['plone.transformchain.disable'] = True

This will leave the response untouched and will not invoke any ITransform adapters at all.

Changelog

1.2.2 (2018-02-11)

Bug fixes:

  • Add Python 2 / 3 compatibility [vincero]

1.2.1 (2017-06-28)

Bug fixes:

  • Remove unittest2 dependency [kakshay21]

1.2.0 (2016-06-21)

New:

  • Added events to notify before/after all/single transform(s) are executed. [jensens]

1.1.0 (2016-02-21)

New:

  • Require Zope2 >= 2.13.23 [jensens]

Fixes:

  • PEP8 et al. use zca decorators, … [jensens]

1.0.4 (2015-05-11)

  • Minor cleanup: whitespace, git ignores, rst. [gforcada, rnix, maurits]

1.0.3 (2013-01-13)

  • There was a problem with the charset regular expression, it expected one space, and only one, between mimetype and charset. So a valid values like “text/html;charset=utf-8” didn’t match and default_encoding was returned. We fixed it by allowing any number of spaces (including zero). [jpgimenez]

1.0.2 (2012-01-26)

  • Fix packaging error. [esteele]

1.0.1 (2012-01-26)

  • Compute error_status and store it on request. Work around bug with Zope 2.13 publication events : response.status is not set when IPubBeforeAbort is notified. [gotcha]

  • Don’t transform FTP requests [rochecompaan]

1.0 - 2011-05-13

  • Release 1.0 Final. [esteele]

1.0b1 - 2010-04-21

  • Initial release

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plone.transformchain-1.2.2.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plone.transformchain-1.2.2-py2-none-any.whl (14.5 kB view details)

Uploaded Python 2

File details

Details for the file plone.transformchain-1.2.2.tar.gz.

File metadata

File hashes

Hashes for plone.transformchain-1.2.2.tar.gz
Algorithm Hash digest
SHA256 38af079d51fd34b7c0e022a7f17902d8408cb6e5bc6055f8bc6f7db6e8f268ee
MD5 ef26b703d9e0e318795eb4dd4df0abde
BLAKE2b-256 4c3b46e301b6878c69d5908693162c7a3a5f70d481c3abb39845f571cf535eca

See more details on using hashes here.

File details

Details for the file plone.transformchain-1.2.2-py2-none-any.whl.

File metadata

File hashes

Hashes for plone.transformchain-1.2.2-py2-none-any.whl
Algorithm Hash digest
SHA256 8b9c32deb6d1185c921d63cb0bd653d2d5e84ccdfb72cd27bc8fa7b465515622
MD5 05737facca9f658d4e07cc891d5b40f5
BLAKE2b-256 26d070ff3ea2a782348e6251b5667b3e4b7550b89d8cd4d321cf604cb450d067

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page