Django Cache + запрос базы данных Django

Я создаю веб-приложение Django, которое позволяет пользователям выбирать фотографию из компьютерной системы и продолжать заполнять временную шкалу пользователей. Сначала на временной шкале будет отображаться 10 фотографий, а затем будет выполнено обновление, чтобы получить следующие 10 фотографий на временной шкале.

Итак, мой первый вопрос: я могу загружать изображения, которые сохраняются в файловой системе, но как мне показать только первые 10, а затем выполнить обновление, чтобы получить следующие 10 и так далее.

Далее, я хочу, чтобы пользовательский интерфейс приложения был быстрым. Итак, я рассматриваю кэширование. Итак, я подумал, что мне кэшировать. Так как в Django есть 3 типа кеша - Database cache, MemCache, or FileSystem Caching. Итак, мой второй вопрос: нужно ли кэшировать первые 10 фотографий каждого пользователя или что-то еще?

Пожалуйста, ответьте с вашими предложениями.


person PythonEnthusiast    schedule 30.07.2013    source источник


Ответы (2)


Итак, мой первый вопрос: я могу загружать изображения, которые сохраняются в файловой системе, но как мне показать только первые 10, а затем выполнить обновление, чтобы получить следующие 10 и так далее.

Извлеките первые 10 фотографий с помощью вашей исходной логики, извлеките следующие фотографии в хронологическом порядке. У вас должна быть временная метка, связанная с публикацией вашей фотографии. Получить изображения в соответствии с этим. Для этого вы можете использовать Django Paginator.

что я кеширую

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

я должен кэшировать первые 10 фотографий каждого пользователя или что-то еще

Зависит от вас. Являются ли эти первые изображения общими для всех пользователей? Затем вы можете кэшировать. Если нет и изображения зависят от пользователя, нет смысла их кэшировать. Пользователь в любом случае должен получить первые изображения. И я очень сомневаюсь, что пользователь будет часто запрашивать одни и те же первые 10 фотографий. Опять же, это ваша логика. Если вы считаете, что кеширование поможет, вы можете его использовать.

person Bibhas Debnath    schedule 30.07.2013
comment
Хорошее и информативное руководство по части кэширования, но у меня есть запрос на получение следующих 10 изображений. У меня есть это утверждение в моем файле views.py documents = Document.objects.filter(owner=request.user)[page_no:page_no+5]. page_no изначально начинается с 0. У меня есть кнопка next в моих шаблонах, которая доставит мои следующие 10 фотографий. Итак, я думал об использовании jQuery + AJAX. Итак, как я буду отправлять данные через jQuery, указывая, какой набор изображений должен отображаться, то есть либо 11-20, либо 21-30, либо 31-40 и так далее. - person PythonEnthusiast; 30.07.2013
comment
Вы также можете использовать собственный Paginator Django. - person Bibhas Debnath; 30.07.2013

Проект 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 обслуживал файл непосредственно с диска.

person GrantJ    schedule 19.03.2016