Как использовать Django Cache без кэширования всей страницы

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

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

Мои settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

Мой view.py

@cache_page(60 * 15)
def list(request, tag_slug=None):
    page = request.GET.get('page')
    data = questions_controller.list_questions(request, tag_slug, None, page)
    if data:
        return render(request, 'questions/list.html', data)
    return page_not_found(request, "Page not found")

2 ответа

Решение

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

Наилучшим подходом является кэширование конечного результата представления с использованием низкоуровневого API-интерфейса кеширования. Если данные являются динамическими, используйте django-сигналы для очистки устаревших кэшированных данных. Настройте приведенный ниже код в соответствии с вашими требованиями.

Просмотры:

from django.core.cache import cache    
def sample(request):
        cached_data = cache.get_many(['query1', 'query2'])
        if cached_data:
            return render(request, 'sample.html', {'query1': cached_data['query1'], 'query2': cached_data['query2']})
        else:
            queryset1 = Model.objects.all()
            queryset2 = Model2.objects.all()
            cache.set_many({'query1': queryset1 , 'query2': queryset2 }, None)
            return render(request, 'sample.html', {'query1': queryset1 , 'query2': queryset2})

Модели:

from django.db.models.signals import post_save
from django.core.cache import cache

@receiver(post_save, sender=Model1)
@receiver(post_save, sender=Model2)
def purge_cache(instance, **kwargs):
    cache.delete_many(['query1', 'query2'])

Надеюсь это поможет.

Кэширование для каждого вида будет кэшировать весь вид, поэтому он подходит для чего-то вроде страницы контактов, но не подходит для видов с динамическим содержимым.

Похоже, кеширование шаблонов - вот что вам нужно. Для частей шаблона, которые могут измениться, вы можете добавить аргумент в {% cache %} тег для однозначной идентификации (из документации Django):

{% load cache %}
{% cache 500 header request.user.username %}
    .. header for logged in user ..
{% endcache %}

Все в {% cache %} тег теперь будет кэшироваться для каждого пользователя, поэтому вы не столкнетесь с ситуацией, когда один пользователь видит заголовок другого пользователя.

Другие вопросы по тегам