Skip to main content

Thumbor image scaling for Plone — replaces in-ZODB scales with Thumbor URLs

Project description

plone-pgthumbor

Thumbor image scaling for Plone — replaces in-ZODB scales with Thumbor redirect URLs.

Instead of generating and storing scaled images in ZODB annotations (via Pillow), this package intercepts Plone's image scaling and returns signed Thumbor URLs. Thumbor fetches the original blob directly from PostgreSQL, scales on demand, and caches the result — no image data ever enters ZODB.

How it works

Plone generates signed Thumbor URLs and either embeds them directly or redirects to them — it never processes image data itself.

Classic Plone / direct @@images traversal

Browser             Plone                        Thumbor              PostgreSQL
  |                   |                             |                      |
  | GET @@images/     |                             |                      |
  |   image/preview   |                             |                      |
  |------------------>|                             |                      |
  |  302 to Thumbor   |                             |                      |
  |<------------------|                             |                      |
  |                                                 |                      |
  | GET /sig/fit-in/400x0/<zoid>/<tid>              |                      |
  |------------------------------------------------>|                      |
  |                                                 | SELECT data          |
  |                                                 | FROM blob_state      |
  |                                                 |--------------------> |
  |                                                 |<---------------------|
  |             200 scaled JPEG (Thumbor cache hit) |                      |
  |<------------------------------------------------|                      |

Volto / REST API (image_scales metadata)

At catalog index time, Plone pre-computes absolute Thumbor URLs for every scale and stores them in the image_scales catalog metadata. Volto reads these directly from the REST API response and renders <img src="https://thumbor/..."> — no redirect hop at all.

In both cases Thumbor retrieves blobs via zodb-pgjsonb-thumborblobloader: local disk cache first, then PostgreSQL bytea, with optional S3 fallback. Cache busting is automatic — the blob TID in the URL changes whenever the image is updated.

Requirements

Installation

pip install plone.pgthumbor

Add to your Plone site's GenericSetup profile dependencies or install via the Add-ons control panel.

Configuration

Environment Variable Default Description
PGTHUMBOR_SERVER_URL (required) Public Thumbor base URL, e.g. http://thumbor:8888
PGTHUMBOR_SECURITY_KEY (required) Shared HMAC-SHA1 signing key
PGTHUMBOR_UNSAFE false Use /unsafe/ URLs instead of signed — dev only

Environment variables take precedence over Plone registry settings (IThumborSettings).

Scale modes

Plone mode Thumbor behaviour
scale (default) fit-in + smart crop — fits within box, no upscale
cover Smart crop to exact dimensions
contain fit-in only — fits within box, no crop

Try It Out

A self-contained Docker Compose stack (Plone 6.2 + Thumbor + PostgreSQL + nginx) using PyPI releases is in tryout/.

cd tryout
docker compose up -d --build
# Plone at http://localhost:8080  (admin/admin)

For development with local source installs, use development/ instead.

Documentation

Rendered documentation: https://bluedynamics.github.io/plone-pgthumbor/

Source Code and Contributions

The source code is managed in a Git repository, with its main branches hosted on GitHub. Issues can be reported there too.

We'd be happy to see many forks and pull requests to make this package even better. We welcome AI-assisted contributions, but expect every contributor to fully understand and be able to explain the code they submit. Please don't send bulk auto-generated pull requests.

Maintainers are Jens Klein and the BlueDynamics Alliance developer team. We appreciate any contribution and if a release on PyPI is needed, please just contact one of us. We also offer commercial support if any training, coaching, integration or adaptations are needed.

License

GPL-2.0

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_pgthumbor-0.1.1.tar.gz (62.1 kB view details)

Uploaded Source

Built Distribution

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

plone_pgthumbor-0.1.1-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file plone_pgthumbor-0.1.1.tar.gz.

File metadata

  • Download URL: plone_pgthumbor-0.1.1.tar.gz
  • Upload date:
  • Size: 62.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for plone_pgthumbor-0.1.1.tar.gz
Algorithm Hash digest
SHA256 17f6153353847f5ec23117ae1b7bae8c021a81b061de2a6ce24f75115ec90b5a
MD5 46e6ef497eadb49214d33b445f7a9b73
BLAKE2b-256 50490c21ac695a86ebb48ea88b538cf0a98bc14cf3e5b49f1163895162e8bdbc

See more details on using hashes here.

Provenance

The following attestation bundles were made for plone_pgthumbor-0.1.1.tar.gz:

Publisher: release.yaml on bluedynamics/plone-pgthumbor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file plone_pgthumbor-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for plone_pgthumbor-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 df1538cd2ecdf352a2526c80efeb055e49f40989c8e5b6651e64fb146b7bca8d
MD5 3612858d10a13f12f7aee6e17cbdfd67
BLAKE2b-256 efa9486a294b4745d06ee08b35bed5858cb8172d26d3494b6772a7537c7c3f22

See more details on using hashes here.

Provenance

The following attestation bundles were made for plone_pgthumbor-0.1.1-py3-none-any.whl:

Publisher: release.yaml on bluedynamics/plone-pgthumbor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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