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

时间:2015-06-26 12:34:45

标签: python django heroku django-staticfiles django-media

我正在尝试在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")

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时,我可以看到文件夹媒体。

1 个答案:

答案 0 :(得分:6)

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

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

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

最常见的是你会在Heroku上使用S3存储桶作为媒体。 This是对此的一个相当全面的解释。您可以跳过有关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用于静态和媒体存储,该链接也解释了这一点。

您可能希望查看this repo以了解AWS设置及其功能的全面详细信息,以及一个包装精美的软件包,以便为您完成部分操作。

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