Мне нужен совет о статических и медиафайлах

Я начинаю программировать на Django и нуждаюсь в вашем совете.

Мой проект представляет собой каталог, содержащий более 1000 товаров. У каждого товара есть изображение.

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

Я прочитал документацию Django и искал в Google статические файлы и медиафайлы, но нашел только рекомендации о том, как «хранить загруженные пользователем данные, такие как изображение профиля, в папке Media». Но я не знаю, применима ли эта рекомендация к моему проекту по оптимизации времени загрузки и управления этими файлами изображений.

Что вы думаете о лучшем способе хранения этих изображений в моем проекте, исходя из вашего опыта?

Я использую Nginx, DigitalOcean VPS.

Благодарю вас!


person bleroy    schedule 19.01.2015    source источник
comment
Все ваши статические ресурсы будут напрямую обслуживаться веб-сервером. Джанго их не обслуживает.   -  person allcaps    schedule 20.01.2015
comment
docs.djangoproject.com/en/1.7/howto/static-files /развертывание   -  person allcaps    schedule 20.01.2015
comment
@allcaps: Это неправда. Если вы настроили статический файловый сервер Django по умолчанию (рекомендуется только для разработки), Django будет обслуживать ваши файлы за вас.   -  person Daniel Robinson    schedule 20.01.2015
comment
Я думаю, что @allcaps имел в виду... обслуживать все статические файлы из /static, а затем при развертывании настроить веб-сервер для перехвата запросов к /static, чтобы обслуживать их, не проходя через Django.   -  person dylrei    schedule 20.01.2015
comment
@DanielRobinson Я использую Nginx, DigitalOcean VPS предлагает производственную среду. Вы правы, сервер разработки обслуживает статические файлы в процессе разработки.   -  person allcaps    schedule 20.01.2015
comment
@allcaps: Да, это производственная среда. В Nginx я установил статическую папку в ту же папку, которая указана в настройках Django.STATIC_ROOT. Я хочу знать плюсы и минусы хранения изображений продуктов в статической папке или медиа-папке. Как это повлияет на время загрузки и управление (например, с помощью collectstatic). Спасибо.   -  person bleroy    schedule 20.01.2015


Ответы (1)


Статические файлы являются частью вашей темы/скина («упаковки»). Эти файлы, как правило, не должны изменяться и должны обслуживаться в зависимости от того, когда браузер в последний раз извлекал их, и устанавливать далеко вперед в будущем:

location /static {
    expires max;
}

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

location /media {
    # Optional: if rollbacks are frequent
    # if_modified_since before;
    expires modified+1w;
}

Что касается откатов: если есть вероятность, что более старые версии образа будут восстановлены из систем резервного копирования или управления версиями, вам нужно установить это. Обратите внимание, что Django не будет устанавливать время модификации загруженного изображения на время модификации на компьютере загрузчика, поэтому новая загрузка будет новым изображением, даже если это предыдущая версия.

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

Еще одна вещь, которую следует отметить, это то, что после этой недели браузер будет каждый раз запрашивать изображения, а nginx будет давать ответ 304, если он не изменился. Таким образом, ваша страница будет генерировать гораздо больше запросов. Это и инструменты оптимизации страницы являются двумя причинами, по которым модифицированные не используются для изображений в дикой природе, а вместо этого используется только первая политика. Чтобы иметь дело с измененными изображениями, вы затем свяжете изображение с другим именем с тем же ресурсом (продуктом), и, таким образом, это ответственность менеджеров контента или промежуточного слоя, который переименовывает загруженные изображения в уникальное имя. Один простой трюк — называть медиа-изображения их хэшем md5 или sha1.

Даже если вы примените единую политику истечения срока действия для обслуживания медиа и статики, я все равно буду обслуживать их из разных каталогов. Причина в том, что статические файлы не должны быть доступны для записи пользователем, работающим с Django (только для пользователя, выполняющего команду управления collectstatic). Это предотвращает ошибки конфигурации или скомпрометированный пользователь Django от вмешательства в статический каталог.

person Melvyn    schedule 20.01.2015