Openshift и Django: раздача загруженных файлов

Интерфейс сайта может позволять пользователю загружать файлы. Файлы должны загружаться в папку, которая указана в переменной MEDIA_ROOT в файле settings.py следующим образом.

MEDIA_ROOT = os.path.join(os.environ['OPENSHIFT_DATA_DIR'], 'media')

Переменная окружения OPENSHIFT_DATA_DIR хранит путь к папке, которая специально предназначена для постоянного хранения данных на сервере. Поэтому именно там должна размещаться папка media, куда попадают загружаемые файлы.

При использовании Django-CMS, файлы загружаются именно в MEDIA_ROOT.

Но есть сложность с раздачей этих файлов. Django не имеет инструментов для раздачи загруженных файлов на боевом сервере.

Чтобы раздавать загруженные файлы надо пойти на хитрость. Сделать так, чтобы они раздавались как static-файлы.

static-файлы автоматически собираются в папку, которая указана в переменной STATIC_ROOT.

Первый шаг

В папке STATIС_ROOT нужно создать символическую ссылку на папку MEDIA_ROOT. Папка STATIC_ROOT очищается каждый раз при деплое, поэтому создавать символическую ссылку надо при каждом деплое. Это можно делать автоматически.

Допустим, что STATIC_ROOT задается в файле settings.py следующим образом.

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static')

Переменной BASE_DIR соответствует переменная окружения OPENSHIFT_REPO_DIR, в которой хранится путь к проекту. То есть путь к static-файлам такой: <путь к проекту>/wsgi/static, и в этой папке нужно создавать символическую ссылку.

Чтобы автоматизировать создание символической ссылки, нужно добавить следующую строчку в файл .openshift/action_hooks/deploy.

echo "Create symbolic link to media."
ln -sf $OPENSHIFT_DATA_DIR/media $OPENSHIFT_REPO_DIR/wsgi/static/media

Второй шаг

В файле settings.py нужно задать переменную MEDIA_URL следующим образом.

MEDIA_URL = STATIC_URL + 'media/'

Итог

Файл settings.py.

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static')

MEDIA_URL = STATIC_URL + 'media/'
MEDIA_ROOT = os.path.join(os.environ['OPENSHIFT_DATA_DIR'], 'media')

 

Автор

Дмитрий Бравиков

Инженер. Электронщик. Программист.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.