Кэширование просмотра Django для каждого пользователя

Мне нужно кэширование каждого пользователя. К сожалению, кэширование в режиме реального времени не поддерживает кэширование на основе пользователей.

Я пробовал кэширование фрагмента шаблона следующим образом:

{% load cache %} {% cache 500 "mythingy" request.user %} ... HTML stuff ... {% endcache %} 

но это медленно, как черт.

Кто-нибудь знает более быстрый способ достичь того, что мне нужно?

Благодаря!

3 Solutions collect form web for “Кэширование просмотра Django для каждого пользователя”

с django> = 1.7, используя страницу cache_page вместе с декораторами differ_on_cookie на вашем представлении, должно решить эту проблему.

что-то вроде этого.

 from django.views.decorators.vary import vary_on_cookie from django.views.decorators.cache import cache_page @cache_page(60 * 15) @vary_on_cookie def view_to_cache(request): ... 

обратите внимание на порядок декораторов, так как vary_on_cookie должен быть обработан до того, как он попадет в cache_page .

Я нашел решение!

Вот этот португальский фрагмент кода, который работает как шарм!

Хорошо, что мне не нужно возиться со своим кодом шаблона, но можно использовать чистый декоратор!

Код приведен ниже

 # -*- encoding: utf-8 -*- ''' Python >= 2.4 Django >= 1.0 Author: eu@rafaelsdm.com ''' from django.core.cache import cache def cache_per_user(ttl=None, prefix=None, cache_post=False): '''Decorador que faz cache da view pra cada usuario * ttl - Tempo de vida do cache, não enviar esse parametro significa que o cache vai durar até que o servidor reinicie ou decida remove-lo * prefix - Prefixo a ser usado para armazenar o response no cache. Caso nao seja informado sera usado 'view_cache_'+function.__name__ * cache_post - Informa se eh pra fazer cache de requisicoes POST * O cache para usuarios anonimos é compartilhado com todos * A chave do cache será uma das possiveis opcoes: '%s_%s'%(prefix, user.id) '%s_anonymous'%(prefix) 'view_cache_%s_%s'%(function.__name__, user.id) 'view_cache_%s_anonymous'%(function.__name__) ''' def decorator(function): def apply_cache(request, *args, **kwargs): # Gera a parte do usuario que ficara na chave do cache if request.user.is_anonymous(): user = 'anonymous' else: user = request.user.id # Gera a chave do cache if prefix: CACHE_KEY = '%s_%s'%(prefix, user) else: CACHE_KEY = 'view_cache_%s_%s'%(function.__name__, user) # Verifica se pode fazer o cache do request if not cache_post and request.method == 'POST': can_cache = False else: can_cache = True if can_cache: response = cache.get(CACHE_KEY, None) else: response = None if not response: response = function(request, *args, **kwargs) if can_cache: cache.set(CACHE_KEY, response, ttl) return response return apply_cache return decorator 

Ниже приведена улучшенная версия для принятого решения, не учитывающая параметры запроса.

decorator_of_cache_per_user.py

 from django.core.cache import cache as core_cache def cache_key(request): if request.user.is_anonymous(): user = 'anonymous' else: user = request.user.id q = getattr(request, request.method) q.lists() urlencode = q.urlencode(safe='()') CACHE_KEY = 'view_cache_%s_%s_%s' % (request.path, user, urlencode) return CACHE_KEY def cache_per_user_function(ttl=None, prefix=None, cache_post=False): def decorator(function): def apply_cache(request, *args, **kwargs): CACHE_KEY = cache_key(request) if prefix: CACHE_KEY = '%s_%s' % (prefix, CACHE_KEY) if not cache_post and request.method == 'POST': can_cache = False else: can_cache = True if can_cache: response = core_cache.get(CACHE_KEY, None) else: response = None if not response: response = function(request, *args, **kwargs) if can_cache: core_cache.set(CACHE_KEY, response, ttl) return response return apply_cache return decorator 
  • как использовать security_csrf_cookie?
  • Как исправить предупреждение об отсрочке в Django 1.9
  • Как связать точки зрения в Django?
  • Вызов специального (не HTTP) URL-адреса из метода form_valid класса Django
  • Измените домен клиента по умолчанию () в unittest из Django
  • Создайте объект django, используя представление без формы
  • Пропустить и просмотреть словарь из представления в шаблон в django
  • Использование fullCalendar в Django
  • Python - лучший язык программирования в мире.