Подтвердить что ты не робот

Результаты кэширования запросов в django

Я пытаюсь найти способ кэшировать результаты запроса, которые не будут меняться с частотой. Например, категории продуктов электронной коммерции (сотовые телефоны, телевизоры и т.д.). Я думаю об использовании кэширования фрагмента шаблона, но в этом фрагменте я буду перебирать список этих категорий. Этот список доступен в любой части сайта, поэтому он находится в моем файле base.html. Должен ли я всегда отправлять список категорий при визуализации шаблонов? Или есть более динамичный способ сделать это, делая список всегда доступным в шаблоне?

4b9b3361

Ответ 1

Поставьте свой кешированный запрос в кеш Django:

from django.core.cache import cache

cache.set('key', queryset)

Затем создайте процессор контекста, чтобы добавить значение кеша ко всем шаблонам:

# myproject/myapp/context_processors.py

from django.core.cache import cache

def cached_queries():
    return {'cache', cache.get('key')}

Затем добавьте свой процессор контекста в файл настроек Django:

TEMPLATE_CONTEXT_PROCESSORS += (
    'myproject.myapp.context_processors.cached_queries'
)

Теперь вы сможете получить доступ к переменной cache во всех общих шаблонах и всех шаблонах, у которых есть контекст запросов, который задан шаблоном, если это сделано в представлении:

return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))

Когда устанавливать кеш

Это зависит от того, что содержится в кеше. Однако общая проблема заключается в том, что Django действительно может выполнять Python всякий раз, когда отправляется запрос на страницу, и часто это не так, где вы хотите выполнять эту работу.

Альтернативой является создание настраиваемой команды управления для определенного приложения. Затем вы можете запустить это вручную, когда это необходимо, или, чаще всего, установить это как задание cron.

Чтобы создать команду управления, вы должны создать класс с расширением Command внутри каталога management/commands, находящегося внутри приложения:

# myproject/myapp/management/commands/update_cache.py

from django.core.management.base import NoArgsCommand
from django.core.cache import cache

class Command(NoArgsCommand):
    help = 'Refreshes my cache'

    def handle_noargs(self, **options):
        cache.set('key', queryset)

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

python manage.py update_cache

Ответ 2

Вы также можете использовать johnny-cache для автоматического кэширования запросов. Он (по умолчанию) кэширует все запросы, но вы можете заставить его не кэшировать некоторые.