如何在 django-heroku 中部署媒体文件?

问题描述 投票:0回答:4

我正在尝试在 heroku 上部署 django 应用程序。我目前使用包 django-heroku 作为标准设置。 在我的模型下,一些使用 ImageField 上传的媒体文件,我希望它们显示在我的模板中。然而,尽管他们似乎指向了正确的目的地,但他们并没有得到服务。

我在 SO 中查看了类似的问题,并在官方包 git 存储库中查找示例,但是我没有找到任何使用相同配置的示例。

设置.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
] 

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'

.
.
.

django_heroku.settings(locals())

模板

{% extends 'base_site.html' %}
{% load i18n %}
{% block content_title %}{% trans 'Manage Product Detail' %}{% endblock%}
{% block content %}

<div class="card">  
  <div class="carousel-inner" role="listbox">
    {% for figure in product.figures.all %}        
        <div class="item{% if forloop.first %} active{% endif %}">                    
              <img src="{{ figure.image.url }}">
        </div>
    {%endfor%}
  </div>
  <div class="card-body">
    <h5 class="card-title">{{ product.name }}</h5>
    <p class="card-text">{{ product.description }}}
  </div>
  <div class="card-footer">
    <h5 class="card-title">{{ product.name }}</h5>
    <p class="card-text">{{ product.description }}}
  </div>
</div>


{% endblock %}

虽然我可以确认媒体文件夹、子文件夹和图像存在(位于项目的根目录)并且该对象存在于模板中,但我仍然遇到以下 404 错误:

Not Found: /media/images/Screenshot_from_2018-12-26_21-07-01.png
[04/Jan/2019 14:32:34] "GET /media/images/Screenshot_from_2018-12-26_21-07-01.png HTTP/1.1" 404 2863
django heroku static media
4个回答
3
投票

django-heroku 包不会提供开箱即用的此功能(由于 Heroku 方面的限制,无法实现媒体文件的无缝部署和开发)。在开发中,必须通过以下方式加载媒体文件:

urlpatterns = [
    ....
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

在生产中,静态文件(如上面提到的某些用户)必须从外部源提供服务。以下是我目前正在遵循的提示:https://web.archive.org/web/20170607080235/http://djangobook.com/serving-files-product/


2
投票

请按照以下步骤操作:

  1. 将 Cloudinary 插件添加到您的 Heroku 应用程序中。

  2. 点击cloudinary并安装。

  3. 然后单击 Cloudinary 插件。

  4. 从此仪表板中,您将能够看到要连接的凭据。

然后转到您的项目:

  1. 在终端中输入以下命令:
pip install django-cloudinary-storage
    
pip install cloudinary
    
pip install Pillow
  1. 在你的settings.py中,添加
INSTALLED_APPS = [
       'django.contrib.staticfiles',   
       'cloudinary_storage',
       'cloudinary',
        ]
    
CLOUDINARY_STORAGE = {
             'CLOUD_NAME': 'your_cloud_name',
             'API_KEY': 'your_api_key',
             'API_SECRET': 'your_api_secret'
            }
    
MEDIA_URL = '/media/'  # or any prefix you choose
     
DEFAULT_FILE_STORAGE='cloudinary_storage.storage.MediaCloudinaryStorage'

在 models.py 中:

10.

class TestModel(models.Model):
             name = models.CharField(max_length=100)
             image = models.ImageField(upload_to='images/', 
             blank=True)
  1. 现在,为了将此图像放入您的模板中,您可以 只需输入:
        <img src="{{ test_model_instance.image.url }}" alt="{{ 
        test_model_instance.image.name }}">
  1. 需求.txt:
...
cloudinary==1.17.0
django-cloudinary-storage==0.2.3

1
投票

我只是想进一步解释安德烈未能理解的其他人所说的内容。当您部署项目时,这些媒体文件不存在 - 它们是在使用应用程序时添加的,并且仅在该期间可用。当测功机进入睡眠状态时,您的应用程序或多或少会重新部署(所有内容都会再次安装以供使用),并且与您第一次部署它的方式完全相同 - 没有媒体文件。


0
投票

django-heroku 现已弃用。

© www.soinside.com 2019 - 2024. All rights reserved.