Кэширование результатов запроса в Django - PullRequest
41 голосов
/ 08 января 2011

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

Ответы [ 2 ]

69 голосов
/ 08 января 2011

Вставьте ваш кэшированный запрос в Кэш 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
13 голосов
/ 10 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...