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

Python 在django 1.8中部署期间提供媒体文件,python,django,heroku,django-staticfiles,django-media,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'

我正在尝试在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")
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
urlpatterns = [
url(r'^', include('feat.urls', namespace="feat")),
url(r'^admin/', include(admin.site.urls)),
 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
wsgi.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")
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
urlpatterns = [
url(r'^', include('feat.urls', namespace="feat")),
url(r'^admin/', include(admin.site.urls)),
 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
url.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")
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
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\u dir/media/media
,当
whitenoise
收集静态文件时,它只在
static\u ROOT
收集文件,因此我如何部署媒体文件。当我运行heroku运行ls时,我可以看到文件夹介质。

因此,首先,重要的是要意识到,如果您有一堆文件是项目的一部分(包括图像等),并随项目一起部署,它们更可能是静态文件,而不是Django术语中的介质文件

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

Heroku的媒体设置是错误的,因为您无论如何都不应该写入服务器上的目录(这是您告诉Django如何使用
media\u ROOT=os.path.join(BASE\u 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用于静态和媒体存储,该链接也解释了这一点

您可能希望了解AWS设置及其功能的一个相当全面的概述,以及一个包装精美的包来为您完成其中的一些功能


更一般地说,我发现Heroku上的所有样板文件都非常有用。

媒体中的文件应该是运行时数据,链接到数据库中的数据,因此它不会被复制,就像它不会复制数据库中的数据一样。我想如果需要一些初始数据,可以使用fixture。否则,您就非常需要我相信是你自己。我知道它们的复制方式与静态文件不同,但是,必须有一种方法来添加媒体图像。即使在制作之后,如果我想在我的管理员中添加新图像,也必须有一种方法将其存储在某个位置,以便它们也被复制。可能在静态文件文件夹中,它们与静态文件一起被复制文件您可以上传它们,这将导致Django将它们放在那里,或者您可以手动复制文件,并在某些脚本中指定
instance.image.path
直接指向它们。路径应该相对于
MEDIA\u ROOT
。我尝试在heroku部署的站点的管理面板中上传它们,但它们没有显示出来d、 我不明白你推荐的第二种方式。我能不能对媒体文件的路径做一些更改,这样当我再次上传它们时,它们就由django放在那里了。我不知道heroku,也许他们有什么办法。我很确定django本身没有,你必须做一个简短的脚本/自定义管理请发表评论。