Служебные медиафайлы во время развертывания в django 1.8

Я пытаюсь развернуть свое приложение django на heroku. Все статические файлы обслуживаются whitenoise и успешно переносятся. Но как мне получить мои медиафайлы, которые загружаются с помощью ImageField для отображения во время производства.

my settings.py

STATIC_URL = '/static/'
STATIC_ROOT = 'C:/Users/Sak/mpro/feat/static/'
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mpro.settings")

application = get_wsgi_application()

try:
  from django.core.wsgi import get_wsgi_application
  from whitenoise.django import DjangoWhiteNoise
  application = get_wsgi_application()
  application = DjangoWhiteNoise(application)   
  from dj_static import Cling
  application = Cling(get_wsgi_application())
except:
     pass

urls.py

urlpatterns = [
url(r'^', include('feat.urls', namespace="feat")),
url(r'^admin/', include(admin.site.urls)),
 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Все мои медиафайлы загружаются на base_dir/media/media и когда whitenoise собирает статические файлы, он собирает только файлы на STATIC_ROOT, поэтому как мне можно развернуть мои медиафайлы. Когда я запускаю запуск heroku run ls я могу видеть heroku run ls в папке.

Ответ 1

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

Медиа файлы в Django предназначены для загруженных файлов времени исполнения. Они, как правило, хранятся с соответствующей записью db, такой как models.ImageField(upload_to='/photos') но это не обязательно так.

Неправильная настройка вашего медиа для Heroku, так как вы все равно не должны писать в каталог на сервере (это то, что вы говорите Django, чтобы сделать с MEDIA_ROOT = os.path.join(BASE_DIR, "media").

Чаще всего вы вместо этого использовали ведро S3 для носителей на Heroku. Это довольно полное объяснение этого. Вероятно, вы можете пропустить бит о CORS и перейти на открытые разрешения на ведро (в зависимости от вашего варианта использования). Важными битами являются:

# settings.py

# Tell django what URL to server your media from
MEDIA_URL = "https://%s/" % AWS_S3_CUSTOM_DOMAIN

# Tell Django to use the boto storage backend to save media files.
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

Если вы хотите использовать S3 для статического и медиа-хранилища, ссылка также объясняет это.

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

В более общем плане я нашел Django Herokuify исключительно полезным для всех шаблонов на Heroku.