我正在尝试在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
时,我可以看到文件夹媒体。
答案 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上的所有样板都特别有用。