2012-05-02 3 views
8

Каков типичный сценарий хранения файлов изображений в Django? Более конкретно, изображения хранятся непосредственно в блоке базы данных (например, MongoDB GridFS), в локальной файловой системе или Amazon S3? Для всех трех случаев существуют ли инструменты или пакеты django для упрощения вашей жизни с сохранением изображений?Как хранить файлы изображений в Django?

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

ответ

8

Типичный, реальный пример будет хранить загруженные изображения в подкаталоге media/ директории вашего сайта :)

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

Но, если у вас нет конкретных требований к первому требованию, единственный способ узнать, какие (если таковые имеются) из этих тысяч вещей вам нужно будет беспокоиться, - это запустить ваш сайт, а самый быстрый способ сделайте это, чтобы сохранить изображения в подкаталоге media/.

Если вы делаете это с помощью FileField, и вы будете осторожны в вашем коде не предположить, например, что изображение представляет собой файл на локальном диске (например, вы сделать использовать .url() метод FileFile и вы не используйте свойство .path), это будет прямое перемещение этих изображений на более подходящий бэкэнд, когда (и если) придет время.

4

По умолчанию Django saves all of your files (and images) in the MEDIA_ROOT. Однако вы можете написать custom file storage, чтобы сохранить его в других местах.

Что выбрать? Это действительно зависит.
Сколько файлов вы планируете хранить? Сколько хранения они будут использовать? Сколько пропускной способности? Как вы думаете, будут ли пики очень высокого использования?

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

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

1

Это действительно зависит от решения, которое вы пытаетесь решить. Существуют случаи, когда s3 может быть гораздо лучшим решением, чем локальное хранилище файлов. s3 предлагает большую гибкость с точки зрения возможности доступа к данным из разных веб-приложений и развязки с сервера, который вы используете. Я думаю, что s3 - это маршрут, если вы планируете использовать много изображений. Если вы считаете, что есть ограниченное количество изображений, которые вы собираетесь использовать, то локальное хранилище на сервере будет прекрасной реализацией (я думаю).

Что касается инструментов, которые вы можете использовать, я бы посмотрел на PIL.http://www.pythonware.com/products/pil/

3

Неплохая практика, per se. Я думаю, тот, кто сказал вам, немного смущен. Django говорит, что вы никогда не должны обслуживать статические ресурсы с помощью Django, т. Е. Они должны обслуживаться непосредственно веб-сервером, который вы используете в качестве обратного прокси для Django (Apache, nginx и т. Д.), Но он не вызывает споров о том, быть на другом сервере или на том же сервере.

Если у вас есть простое приложение или веб-сайт, использование совершенно другого сервера для статических файлов, вероятно, будет излишним. Это имеет значение только в случаях высокого параллелизма (думаю, Twitter, Facebook и т. Д.), Где приложение не может позволить себе беспокоиться о том, что веб-сервер беспокоится о чем-либо, кроме отправки запросов самому приложению. Теперь некоторые веб-хосты предлагают «облачное» хранилище для совместного использования VPS (например, Rackspace). Если вы используете такой хост, обязательно используйте то, что у вас есть, но это не обязательно для большинства.

Однако есть это преимущество в обслуживании статических ресурсов под другим подобласти. Вы можете использовать один и тот же сервер, но использование субдомена (например, static.mysite.com) позволит браузерам делать больше параллельных загрузок, в некоторых случаях и, по крайней мере, запрещает прикреплять файлы cookie с основного веб-сайта к каждому статическому запрос.

Смежные вопросы