Кэширование на основе уникальных пользователей в 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')
Оговорка заключается в том, что кэш не будет иметь возможности завершать работу по окончании запроса. Вы можете сделать это вручную... Или, если у вас много представлений, вы можете написать промежуточное ПО, которое устанавливает и удаляет ключ кэша при запросе и ответе соответственно.