Django, обслуживающий мультимедийные файлы (загруженные пользователем файлы) в режиме спуска

Я успешно развернул свой проект Django в openshift. Но я должен иметь возможность обслуживать файлы, которые загружаются пользователями. Для этого я пользуюсь MEDIA_ROOT и MEDIA_URL. Я следил за этим учебником здесь, но ничего не произошло. Я должен был изменить MEDIA_ROOT, потому что предлагаемый там не правильный, я думаю. Поэтому мой MEDIA_ROOT выглядит как

MEDIA_ROOT = os.path.join(os.environ.get('OPENSHIFT_DATA_DIR', ''),'media')
MEDIA_URL = '/media/'

Я добавил папку .htaccess в /wsgi, как сказано в статье

RewriteEngine On
RewriteRule ^application/media/(.+)$ /static/$1 [L]    

и создал сборку script, чтобы сделать символическую ссылку на носитель в статике, как говорится в статье.

#!/bin/bash
if [ ! -d $OPENSHIFT_DATA_DIR/media ]; then
    mkdir $OPENSHIFT_DATA_DIR/media
fi

ln -sf $OPENSHIFT_DATA_DIR/media $OPENSHIFT_REPO_DIR/wsgi/static/media

В моем urls.py я добавил

urlpatterns += static(settings.MEDIA_ROOT, document_root=settings.MEDIA_URL)

но я до сих пор не могу их обслуживать. Я также попытался не включать статический метод django в urls.py, но тот же результат.

В еще учебнике .htacces помещается в статическую папку. Я что-то делаю неправильно?

Ответ 1

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

RewriteEngine On
RewriteRule ^application/media/(.+)$ /static/media/$1 [L]  

Надеюсь, что это поможет другим.

Ответ 2

Проблема заключается в вашем медиа-адресе. Симлинковая ссылка создается на wsgi/static/media, тогда ваша MEDIA_URL нужна MEDIA_URL = '/static/media/'

Первый шаг, на сборке script.openshift/action_hooks/build:

if [ ! -d $OPENSHIFT_DATA_DIR/media ]; then mkdir $OPENSHIFT_DATA_DIR/media fi

ln -sf $OPENSHIFT_DATA_DIR/media $OPENSHIFT_REPO_DIR/wsgi/static/media

Второй шаг: В настройках:

MEDIA_URL = '/static/media/'

if ON_PAAS:
    MEDIA_ROOT = os.path.join(os.environ.get('OPENSHIFT_DATA_DIR'), 'media')
else: 
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Ответ 3

У меня была та же проблема, но решение Apostolos выше не решило проблему: когда я пытаюсь получить доступ к http://<domain>/media/<file>, он все равно не работает.

Однако это работает по-другому. если я попытаюсь получить доступ к тому же файлу, как если бы он был статичным с помощью http://<domain>/static/media/<file>, тогда он работает. Это происходит даже без использования обходного решения Gpzim98. Я думаю, причина в том, что медиа файлы теперь доступны через символическую ссылку. Другими словами, мультимедийные файлы не обслуживаются, но теперь вы можете сделать вид, что они являются статическими файлами.

Было бы очень интересно понять, что происходит и как решить эту проблему полностью (если это можно сделать) и иметь возможность обслуживать мультимедийные файлы непосредственно через MEDIA_URL.

Спасибо