在django 1.8中部署期间提供媒体文件

Wut*_*Wut 16 python django heroku django-media django-staticfiles

我正在尝试在heroku上部署我的django应用程序.所有静态文件都由whitenoise成功提供并迁移.但是如何ImageField在生产期间获取用于上传的媒体文件.

我的 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")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我的所有媒体文件都上传到base_dir/media/media,当whitenoise收集静态文件时,它只收集文件STATIC_ROOT,所以如何部署我的媒体文件.当我运行时,heroku run ls我可以看到文件夹媒体.

Tom*_*eld 6

所以,首先重要的是要意识到如果你有一堆文件属于你的项目(包括像图像之类的东西)并随之一起部署,它们更可能是静态文件而不是媒体文件. Django的说法.

Django中的媒体文件用于运行时上传的文件.它们通常与相应的数据库条目一起存储,models.ImageField(upload_to='/photos')但不一定如此.

Heroku的媒体设置是错误的,因为你不应该写到服务器上的目录(这就是你告诉Django要做的事情MEDIA_ROOT = os.path.join(BASE_DIR, "media").

最常见的是你会在Heroku上使用S3存储桶作为媒体.是一个相当全面的解释.您可以跳过有关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'
Run Code Online (Sandbox Code Playgroud)

如果您想将S3用于静态和媒体存储,该链接也会解释这一点.

您可能希望查看此repo以获得相当全面的AWS设置及其功能,以及一个包装精美的程序包,以便为您完成一些操作.

更一般地说,我发现Django Herokuify对Heroku上的所有样板都特别有用.