Skip to content

[BUG] v2.9.2-ls243 (Python 3.14) — HTTP 500 on all authenticated pages via bundled django-imagekit 5.0.0 #49

Description

@playcations

Is there an existing issue for this?

  • I have searched the existing issues (none found for Python 3.14 / imagekit / this 500).

Current Behavior

After the image updated to v2.9.2-ls243 (build date 2026-08-02), which moved the base to Python 3.14.5 (the previous -ls242 build was on Python 3.13), every authenticated page returns HTTP 500. GET /dashboard/ — and any page that renders a child profile thumbnail — raises:

Django Version: 5.2.14
Python Version: 3.14.5
Exception Type: TypeError
Exception Value: _Pickler._batch_setitems() missing 1 required positional argument: 'obj'
Exception Location: /lsiopy/lib/python3.14/site-packages/imagekit/hashers.py, line 22, in save_dict
Raised during: dashboard.views.Dashboard

Error during template rendering
In template /app/www/public/core/templates/core/child_thumbnail.html, at line 3
    {% thumbnail '40x40' child.picture as thumb %}

  File ".../imagekit/hashers.py", line 22, in save_dict
    self._batch_setitems(sorted(obj.items()))
when serializing pilkit.processors.resize.Thumbnail state

Root cause: the image bundles django-imagekit 5.0.0, whose CanonicalizingPickler.save_dict calls self._batch_setitems(sorted(obj.items())). Python 3.14 changed that private pickle API to _batch_setitems(self, items, obj). django-imagekit fixed this in 6.0 (matthewwithanm/django-imagekit#583, "Support Python 3.14"; current release 6.1). However Baby Buddy's Pipfile pins django-imagekit = "~=5.0" (i.e. <6.0), so this ls243 build ends up shipping imagekit 5.0.0 on a Python 3.14 base — incompatible. So the trigger is the base image moving to Python 3.14 while the app's dependency pin can't pull the fixed imagekit.

Tracked upstream (app side) at babybuddy/babybuddy#1103.

Secondary 500: when django-axes (7.1.0) locks an account, GET /login/lock also returns 500 with TemplateSyntaxError: add requires 2 arguments, 1 provided while rendering the lockout message under Django 5.2 / Python 3.14.

Expected Behavior

Authenticated pages load (HTTP 200), as on v2.9.2-ls242 (Python 3.13).

Steps To Reproduce

  1. Deploy lscr.io/linuxserver/babybuddy:v2.9.2-ls243.
  2. Have a child with a profile picture uploaded.
  3. Log in → GET /dashboard/ → HTTP 500.

(Depends on a child having a picture — the thumbnail render is what triggers the imagekit pickle path.)

Environment

- OS: TrueNAS / Debian docker host, x86_64
- Image: lscr.io/linuxserver/babybuddy
- Tag: v2.9.2-ls243  (revision e4c072eeb77b0af7b658eb98559be7754fb10093, build 2026-08-02)
- Baby Buddy: 2.9.2
- Django: 5.2.14
- Python: 3.14.5
- django-imagekit: 5.0.0
- pilkit: 3.0
- django-axes: 7.1.0
- Database: SQLite (default)

Suggested resolution

Either keep/pin the Python base at 3.13 until the app allows a Python-3.14-compatible django-imagekit, or coordinate with Baby Buddy upstream (babybuddy/babybuddy#1103) to relax the django-imagekit = "~=5.0" pin to allow >=6.0. Rolling back to v2.9.2-ls242 is a confirmed workaround (same Baby Buddy version, data unaffected).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions