Кэширование результатов запроса в Django

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

2 ответа

Решение

Вставьте ваш кешированный запрос в кеш 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

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

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