Django Cache + Запрос базы данных Django
Я создаю веб-приложение Django, которое позволяет пользователям выбирать фотографию в компьютерной системе и продолжать заполнять ее на временной шкале. Временная шкала сначала будет отображать 10 фотографий, а затем обновится, чтобы получить следующие 10 фотографий на временной шкале.
Итак, мой первый вопрос - я могу загружать изображения, которые сохраняются в файловой системе, но как мне показать только первые 10, а затем вытащить обновление, чтобы получить следующие 10, и так далее.
Далее, я хочу, чтобы пользовательский опыт приложения был быстрым. Итак, я рассматриваю кеширование. Итак, я думал, что я кеширую. Так как в Django есть 3 типа кеша Database cache, MemCache, or FileSystem Caching
, Итак, мой второй вопрос: я должен кэшировать первые 10 фотографий каждого пользователя или что-то еще?
Пожалуйста, ответьте с вашими предложениями.
2 ответа
Итак, мой первый вопрос - я могу загружать изображения, которые хранятся в файловой системе, но как мне показать только первые 10, а затем вытащить обновление, чтобы получить следующие 10, и так далее.
Получите первые 10 с вашей первоначальной логикой, найдите следующие фотографии в хронологическом порядке. У вас должна быть некоторая временная метка, связанная с размещением вашей фотографии. Получить изображения в соответствии с этим. Вы можете использовать Django Paginator
за это.
что я кеширую
Все статические данные, которые вы хотите показывать пользователю часто и сразу же не изменится. Вы можете кэшировать для каждого пользователя или для всех пользователей. В соответствии с этим вы выбираете, что кэшировать.
я должен кэшировать первые 10 фотографий каждого пользователя или что-то еще
Зависит от тебя. Эти первые картинки являются общими для всех пользователей? Тогда вы можете кешировать. Если нет и изображения зависят от пользователя, то нет смысла их кэшировать. Пользователь в любом случае должен будет получить первые изображения. И я очень сомневаюсь, что пользователь будет часто просить одни и те же первые 10 фотографий. Опять же, это ваша логика. Если вы думаете, что кеширование поможет, вы можете пойти дальше и кешировать.
Проект DiskCache был впервые создан для аналогичной проблемы (кэширование изображений). Он включает в себя несколько функций, которые помогут вам эффективно кэшировать и обслуживать изображения. DiskCache является лицензированной библиотекой дискового и файлового кэша Apache2, написанной на чистом Python и совместимой с Django.
diskcache.DjangoCache предоставляет Django-совместимый интерфейс кеша с несколькими дополнительными функциями. В частности, get
а также set
методы позволяют читать и писать файлы. Пример:
from django.core.cache import cache
with open('filename.jpg', 'rb') as reader:
cache.set('filename.jpg', reader, read=True)
Позже вы можете получить ссылку на файл:
reader = cache.get('filename.jpg', read=True)
Если вам просто нужно имя файла на диске (в кеше):
try:
with cache.get('filename.jpg', read=True) as reader:
filename = reader.name
except AttributeError:
filename = None
Приведенный выше код запрашивает файл из кэша. Если такого значения нет, оно вернется None
, None
приведет к возникновению исключения with
заявление, потому что ему не хватает __exit__
метод. В этом случае исключение поймано и filename
установлен в None
,
С именем файла вы можете использовать что-то вроде X-Accel-Redirect, чтобы указать Nginx, что файл должен обслуживаться напрямую с диска.