Making key_prefix callable for more flexible caching

442 views
Skip to first unread message

Tobias Kunze

unread,
Jan 22, 2022, 10:37:47 AM1/22/22
to django-d...@googlegroups.com
Hi all,

after mostly caching via external tools or manually for years, I've been
trying out Django's built-in caching recently, and have ran into an issue that
I believe could improve the use cases of `cache_page` a lot:

`cache_page`/`CacheMiddleware` take an optional `key_prefix` argument as a
string, falling back to `settings.CACHE_MIDDLEWARE_KEY_PREFIX`.

If this argument could be a callable (getting the current request as
argument), it would be much easier to cache different versions of the page,
for example for users with different access rights, or to make sure newer
changes are reflected by including a version or timestamp in the cache key.

This change was proposed, uhm, 13 years ago, and was closed when the
key_prefix became a site-wide setting. Any arguments for/against re-opening?

https://code.djangoproject.com/ticket/11269

Additionally, for several of my use cases it would have been very neat to be
able to determine the cache key myself, which is currently generated fairly
deep into the caching stack based on the prefix, the request and so on. While
that's a good default, it makes it harder to interact with the cache from
outside the request-response cycle for the view being cached.
(But that's a bigger ask, because there's less existing infrastructure to pass
down a changed key function – I'd be pretty happy with just a dynamic prefix.)

Best,
Tobias
--
Tobias Kunze / rixx (er/he)

Adam Johnson

unread,
Jan 23, 2022, 5:37:52 AM1/23/22
to Django developers (Contributions to Django itself)
Hi Tobias

I think it's also worth mentioning your blog post, in which you explain (to yourself) how to currently achieve dynamic keys:https://rixx.de/blog/how-django-s-page-cache-works/ . It's a lot of work.

The closure of #11269 does seem like an oversight, since the CACHE_MIDDLEWARE_KEY_PREFIX setting doesn't support dynamic prefixes.

I am in favour of allowing callable prefixes. It seems like a small feature with great utility.

Thanks,

Adam

--
You received this message because you are subscribed to the Google Groups "Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/20220122153731.4beyiyepuahiprgu%40cordelia.localdomain.

Alexandru M.

unread,
Mar 21, 2022, 7:37:34 PM3/21/22
to Django developers (Contributions to Django itself)
Are there any plans to work on this? I can pick it up as I already implemented this functionality into own project. What is the process to working on the new features?

Adam Johnson

unread,
Mar 22, 2022, 7:49:18 PM3/22/22
to Django developers (Contributions to Django itself)
It doesn't look like Tobias has done anything. I would say open a new ticket referencing this discussion, and then open your PR against that. All the how-to's are in the docs: https://docs.djangoproject.com/en/dev/internals/contributing/

Alexandru M.

unread,
Mar 28, 2022, 12:39:43 PM3/28/22
to Django developers (Contributions to Django itself)
Reply all
Reply to author
Forward
0 new messages