Files
authentik/packages/django-postgres-cache/django_postgres_cache/backend.py
Jens L. 986f082b59 packages/django-postgres-cache: Initial implementation of postgres cache (#16653)
* start db cache

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* update codeowners

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* handle db error in keys

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* implement rest of the methods

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix unrelated warning on startup for cache

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix migrations?

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* add readme

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* dynamic dependency...?

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* types

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* rip out django_redis

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* format

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix tests?

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix get default

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* some cleanup

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* simplify to use ORM

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* remove old migrations that use cache instead of doing dynamic things

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix migration

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* Update packages/django-postgres-cache/django_postgres_cache/models.py

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

* Update packages/django-postgres-cache/django_postgres_cache/migrations/0001_initial.py

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

* fix redis imports

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

* more redis removal

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

* lint

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2025-10-02 16:01:28 +02:00

52 lines
1.9 KiB
Python

from typing import Any
from django.core.cache.backends.db import DatabaseCache as BaseDatabaseCache
from django.db.utils import ProgrammingError
from django.utils.module_loading import import_string
from django.utils.timezone import now
from django_postgres_cache.models import CacheEntry
class DatabaseCache(BaseDatabaseCache):
def __init__(self, table: str, params: dict[str, Any]) -> None:
super().__init__(table, params)
self.reverse_key_func = import_string(params["REVERSE_KEY_FUNCTION"])
self._table = CacheEntry._meta.db_table
self.cache_model_class = CacheEntry
def _cull(self, *args: Any, **kwargs: Any) -> None:
"""Stubbed out cull method as we cull in a background task"""
pass
def get(self, key: str, default: Any | None = None, version: int | None = None) -> Any:
try:
return super().get(key, default=default, version=version)
except ProgrammingError:
return default
def keys(self, keys_pattern: str, version: int | None = None) -> list[str]:
try:
return self._keys(keys_pattern, version=version)
except ProgrammingError:
return []
def _keys(self, keys_pattern: str, version: int | None = None) -> list[str]:
keys_pattern = self.make_key(keys_pattern.replace("*", ".*"), version=version)
return [
self.reverse_key_func(key)
for key in CacheEntry.objects.filter(cache_key__regex=keys_pattern).values_list(
"cache_key", flat=True
)
]
def ttl(self, key: str, version: int | None = None) -> int | None:
"""Get TTL left for a given key and version"""
key = self.make_and_validate_key(key, version=version)
entry = CacheEntry.objects.filter(cache_key=key).first()
if not entry:
return None
return int((entry.expires - now()).total_seconds())