Кэширование на основе уникальных пользователей в django

В django 3.2 какой самый чистый способ доступа к идентификатору пользователя в функциях, вызываемых из представлений или вне представлений?

Я хочу реализовать кэширование в своем проекте, но оно должно быть специфичным для каждого пользователя. Я подумал, что могу просто получить доступ к идентификатору пользователя и интегрировать его в ключ кэша. Проблема в том, что для этого требуется доступ к объекту запроса, а мне часто нужен доступ внутри функций, вызываемых представлением.

Я не хочу менять все свои функции, чтобы добавить объект запроса, если только это не лучшее решение.

Можно ли установить что-то вроде глобала на время выполнения запроса, чтобы получить доступ к нему в любом месте после того, как он попадет в представление? Похоже, что это влезает в потоки и кажется халтурным.

FWIW В настоящее время я использую django-cache-memoize, который делает все, что мне нужно https://github.com/peterbe/django-cache-memoize

и memcached, который мне тоже нравится.

Лучшей рекомендацией будет добавить LocMemCache в качестве нестандартного кэша, а затем указать использовать его всякий раз, когда вам нужно потоково-локальное кэширование:

# settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    },
    'local': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
# views.py
from django.core.cache import caches
def view(request):
    cache = caches['local']
    cache.set('user', request.user)
# functions.py
from django.core.cache import caches

cache = caches['local']

def function():
    user = cache.get('user')

Оговорка заключается в том, что кэш не будет иметь возможности завершать работу по окончании запроса. Вы можете сделать это вручную... Или, если у вас много представлений, вы можете написать промежуточное ПО, которое устанавливает и удаляет ключ кэша при запросе и ответе соответственно.

Вернуться на верх