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

20

我正试图将我的Django应用程序部署到Heroku。所有静态文件都由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时,我可以看到媒体文件夹。

2
嗯,在媒体文件中的数据应该是运行时数据,与数据库中的数据链接,因此不会被复制,就像它不会复制数据库中的数据一样。如果您需要一些初始数据,我想您可以使用固定装置。否则,我相信您基本上是自己解决了。 - spectras
我知道它们不像静态文件那样被复制,但是一定有一种方法可以添加媒体图片。即使在生产环境中,如果我想在我的管理界面中添加新的图片,也必须有一种方法将它们存储在某个地方,以便它们也会被复制。也许可以将它们放在静态文件夹中,与静态文件一起被复制。 - WutWut
您可以上传它们,这将导致Django将它们放在那里;或者您可以手动复制文件,并将instance.image.path分配为某些脚本中直接指向它们。路径应相对于MEDIA_ROOT - spectras
我尝试将它们上传到由Heroku部署的网站的管理面板中,但它们没有显示出来。而且我不理解你推荐的第二种方法。我不能更改媒体文件的路径,以便当我再次上传它们时,它们由Django放置在那里吗? - WutWut
嗯,我不了解Heroku,也许他们有相关的东西。我非常确定Django本身没有这个功能,你需要编写一个简短的脚本/自定义管理命令来实现它。 - spectras
显示剩余3条评论
1个回答

10
首先需要意识到,如果您有一堆文件是项目的一部分(包括图像等),并且随项目一起部署,那么它们更可能是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'

如果您想同时使用S3进行静态和媒体存储,链接也会解释这一点。
您可能想查看this repo以获取关于AWS设置及其功能的全面介绍,并且还有一个很好的打包程序可以为您完成其中的一些操作。
更一般地说,我发现Django Herokuify对于所有Heroku模板非常有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接