@abbrakadabbra

Как оптимизировать/закешировать медленные части кода в Django?

Проект написан на Django + Postgres. Построена некая система доступа на основе множества критериев, где простым запросом узнать, имеет ли пользователь доступ куда-то, не получается.
Выполняется цепочка методов, внутри которых имеются так же циклы, которые составляют Q(). К сожалению переписать это сейчас непросто, т.к. на этой система доступа построен весь проект.

Возможно это как-то будет исправляться, но на данный момент решением наверное может быть кеширование.

Возможное решение:
Т.к. на получение "карты доступа" для некоторых пользователей уходит до 30 секунд. Мы подумали, что её карту доступа можно сохранить в кеше (redis) на этапе авторизации пользователем, отправляя параллельно celery-таск. Результат выполнения таска будет сохранен в кеше, к которому можно обратиться после, уже с более быстрым временем выполнения.

Т.к. карта доступа может измениться, при каких-то изменениях можно отправить сигнал на её "переисполнение".

Как считаете, рабочая ли такая идея и какие могут быть подводные камни?

P.S. Запросы по-отдельности дебажились через debug toolbar, и они достаточно быстрые. Проблема в циклах и общем времени выполнения/рендеринга. Индексы у таблиц имеются. К БД претензий нет.

P.S. повторю еще раз, что основные методы, которая в цикле что-то проверяют. делают Q() и т.д. переписать сейчас нельзя.
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Я сравнительно недавно столкнулся с подобной ситуацией и просто вынес кучерявую логику в хранимые процедуры.
Ответ написан
Комментировать
netpastor
@netpastor
Python developer
Так же помогает заменить цепочку запросов на один view в базе данных и получать доступ к нему через unmanaged модель
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы