Кеширование view в Django/DRF с возможностью очищения кеша?
Доброго времени суток.
Пытался я тут настроить кеширование для некоторых view с возможностью очищения кеша по handler (всякими post_save и прочим).
И я был поражен: из всего того, что я нашел - всё просто ужасно костыльное
- Дефолтный cache_page - не поддерживает удаления нормального вообще
- easy-cache- кеширует, по большей части, только property
- django-cacheops - кеширует, по большей части, только instance или queryset (cache_view только на бумаге работает, удаления тоже нет)
В попытках найти кеширование view с invalidate - потерпел поражение.
Что посоветуете использовать? Как подойти к вопросу?
django-cacheops в большей степени заточен на кэширования уровня ORM, зато инвалидация там навороченная. В целом, можно попробовать переиспользовать инвалидацию уровня ORM с помощью cached_as, но это будет замороченно с т.з. логики и тяжело в поддержке.
По-сути вам придется продублировать автоматически работающие правила инвалидации ORM-а на уровне декораторов view, но уже вручную. И поддерживать консистентность между этими правилами и тем, как в действительности этот view формирует ответ.
Мы остановились на том, что при необходимости облегчаем генерацию ответов DRF за счет values() и prefetch_related(), а инвалидацию оставили там где она лучше всего работает - на уровне ORM.
Да, я настроил cacheops, но cacheops, как я понял, не заточен под DRF от слова "совсем". Там даже тип request в cache_view проверяется на HttpRequest (тип request дефолтной Django без DRF). Я пытался переписать чать с cache_view под drf, но это действительно очень непростая в поддержке вещь. В итоге - ушел от этого.
Я пытался даже создавать функцию внутри функции (как декоратор) и кешировать изнутри view ее response, но это и выглядит ужасно, и работает так себе. Если одинаковый ответ запроса для всех юзеров наворотить можно, то индивидуальный - крайне трудно.
Пока что ограничился оптимизацией ORM запросов, всякими select_related, perfetch_related, values и связками cache + CacheMiss из cacheops.
Надеюсь в будущем что-то появится. Некоторые небольшие ответы view проще хранить в уже готовом виде. Надеюсь, что cacheops будет развиваться.