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

Posted

技术标签:

【中文标题】在 django 1.8 中部署期间提供媒体文件【英文标题】:Serving Media files during deployment in django 1.8 【发布时间】:2015-09-13 09:59:10 【问题描述】:

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

【问题讨论】:

好吧,媒体中的文件应该是运行时数据,链接到数据库中的数据,所以它不会被复制,同样它不会从数据库中复制数据。如果您需要一些初始数据,我想您可以使用固定装置。否则,我相信你几乎是靠自己的。 我知道它们的复制方式与静态文件不同,但是,必须有一种添加媒体图像的方法。甚至可能在生产之后,如果我想在我的管理员中添加新图像,必须有一种方法将其存储在某个地方以便它们也被复制。可能在静态文件文件夹中,它们与静态文件一起复制跨度> 您可以上传它们,这将导致 Django 将它们放在那里,或者您可以手动复制文件,并指定 instance.image.path 在某些脚本中直接指向它们。路径应该相对于MEDIA_ROOT 我尝试在 heroku 部署的站点的管理面板中上传它们,但它们没有显示出来。我不明白你推荐的第二种方式。我不能对媒体文件的路径进行一些更改,以便当我再次上传它们时,它们会被 django 放在那里。 好吧,我不认识heroku,也许他们有这方面的东西。我很确定 Django 本身不会,您必须编写一个简短的脚本/自定义管理注释才能做到这一点。 【参考方案1】:

因此,首先重要的是要认识到,如果您有一堆文件是项目的一部分(包括图像等)并与它一起部署,那么它们更有可能是静态文件而不是Django 用语中的媒体文件。

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

对于 Heroku,您的媒体设置是错误的,因为无论如何您都不应该写入服务器上的目录(这就是您告诉 Django 对 MEDIA_ROOT = os.path.join(BASE_DIR, "media") 执行的操作。

大多数情况下,您会改用 S3 存储桶存储 Heroku 上的媒体。 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 用于静态 AND 媒体存储,该链接也对此进行了说明。

您可能想查看this repo,以了解 AWS 设置及其作用的全面概要,以及一个包装精美的软件包来为您完成其中的一些工作。

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

【讨论】:

以上是关于在 django 1.8 中部署期间提供媒体文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ubuntu 14.04 上使用 nginx 和 gunicorn 部署 django 1.8 应用程序

CentOS 7环境部署——Django

无法在 Django 1.8 中解析静态 JSON 文件

Heroku for Django 1.8 的 Procfile

升级到 Django 1.8 后“提供的固定默认值”

Apache下部署Django日志时区显示不正确的问题