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