2014-10-07 2 views
1

Я использую Amazon S3 как часть моего веб-сервиса. Рабочий процесс следующий:Локальная файловая система как удаленное хранилище в Django

  • Пользователь загружает множество файлов на веб-сервер. Web-сервер сначала сохраняет их локально, а затем загружать их в S3 асинхронно
  • Пользователь посылает HTTP-запрос, чтобы начать работу (что некоторая обработка этих загруженных файлов)
  • Веб-служба просит работник, чтобы сделать работу
  • работник делает то работа и добавления приводит к S3
  • Пользователь запрашивает ссылку на загрузку с веб-сервера, somedbrecord.result_file.url возвращается
  • загрузки пользователем результат по этой ссылке

для работы с файлами я использую QueuedStorage бэкэнд. Я посвящаю мою FileFields так:

user_uploaded_file = models.FileField(..., storage=queued_s3storage, ...) 
    result_file = models.FileField(..., storage=queued_s3storage, ...) 

Где queued_s3storage является объект класса, полученный из ...backends.QueuedStorage и remote поля устанавливается '...backends.s3boto.S3BotoStorage'.

Теперь я планирую развернуть всю систему на одной машине, чтобы запускать все локально, я хочу заменить это '...backends.s3boto.S3BotoStorage' чем-то, основанным на моей локальной файловой системе.

Первым обходным путем было использование FakeS3, который может «подражать» S3 локально. Работает, но это не идеально, просто лишние лишние накладные расходы.

У меня есть сервер Nginx, работающий и обслуживающий статические файлы из определенных каталогов. Как создать класс «удаленного хранения», который на самом деле хранит файлы локально, но предоставляет ссылки для загрузки, которые приводят к файлам, обслуживаемым Nginx? (что-то вроде http://myip:80/filedir/file1). Существует ли стандартный класс библиотеки для django?

ответ

4

Хранение по умолчанию для мультимедийных файлов - местное хранилище.

Ваш settings.py определяет эти переменные две среды:

  • MEDIA_ROOT(link to docs) - это абсолютный путь к папке локального хранения файлов
  • MEDIA_URL(link to docs) - это путь веб-сервер HTTP (например '/media/' или '//%s/media' % HOSTNAME

Эти файлы используются по умолчанию для хранения файлов мультимедиа. По умолчанию Django/gl Obal settings.py:

# Default file storage mechanism that holds media. 
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' 

Это сконфигурировано хранения по умолчанию используется в FileFields, для которых нет хранения kwarg не предусмотрено. Доступ к нему также можно получить так: rom django.core.files.storage import default_storage.


Так что, если вы хотите изменить хранилище для местного развития и использования в производстве, вы можете сделать что-то вроде этого:

# file_storages.py 
from django.conf import settings 
from django.core.files.storage import default_storage 
from whatever.backends.s3boto import S3BotoStorage 

app_storage = None 
if settings.DEBUG == True: 
    app_storage = default_storage 
else: 
    app_storage = S3BotoStorage() 

И в ваших моделях:

# models.py 
from file_storages import app_storage 

# ... 
    result_file = models.FileField(..., storage=app_storage, ...) 

Наконец, вы хотите, чтобы nginx обслуживал файлы непосредственно с вашего MEDIA_URL. Просто убедитесь, что URL-адрес nginx соответствует пути в MEDIA_URL.

+0

Спасибо! MEDIA_URL - это то, что я искал –

+0

. Что HOSTNAME вы упомянули, что-то встроенное в django? Или это моя собственная переменная, которую я указываю в settings.py? –

+1

Ваша собственная переменная. – pztrick

1

Я планирую развернуть всю систему на одной машине, чтобы запустить все локально

прекратить использование QueuedStorage тогда, потому что "[QueuedStorage] enables having a local and a remote storage backend" и вы только что сказали, что вы не хотите, пульт дистанционного управления.

Просто используйте FileSystemStorage и настроить Nginx для обслуживания location/settings.MEDIA_ROOT

+0

Конечно, мне теперь не нужно QueuedStorage. –

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