Heroku Django图像未加载

2024-09-29 23:20:54 发布

您现在位置:Python中文网/ 问答频道 /正文

几个小时来我一直在想办法解决这个问题,但我似乎没办法解决这个问题。我已经安装了whitenoise,网站除了没有加载图像外,运行良好。以下是我的媒体代码:

├───.意念

├───分析员

│ └───pycache

├───博客

│ ├───迁移

│ │ └───pycache

│ ├───静止的

│ │ ├───博客

│ │ └───图像

│ ├───模板

│ │ └───博客

│ └───pycache

└───媒体

└───第11条

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

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

主要网址:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls'))
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

主模板:

{% extends "blog/base.html" %}
{% load static %}
{% load crispy_forms_tags %}

{%block content%}
<!-- Images Section -->

<div class="swiper-container" style="height:520px;">
        <div class="swiper-wrapper">

            <section class="swiper-slide about two">
                <div class="container">
                    <div class="title title-dark">
                        <h2 class="title-heading">Analyze Everything</h2>
                        <img class="about-profile" src="{%static 'images/think.png'%}" alt="">
                        <p class="price"></p>
                    </div>
                    <div class="cta">

                    </div>
                </div>
            </section>

            <section class="swiper-slide about two">
                <div class="container">
                    <div class="title title-dark">
                        <h2 class="title-heading">Free Subscription</h2>
                        <h3 class="title-sub-heading">Read. Analyze. Learn.</h3>
                    </div>
                    <div class="cta">
                        <a href="#newsletter" class="btn btn-danger">Subscribe</a>
                    </div>
                </div>
            </section>


            </div>
     <div class="swiper-pagination"></div>
    <!-- Add Arrows -->
    <div class="swiper-button-next"></div>
    <div class="swiper-button-prev"></div>




</div>
<!-- End of Images Section -->

<!-- Latest Articles -->
<div class="container">
    <hr><br>
    <h1 class="text-center">Latest Articles</h1>
    <!-- Row One of Articles -->
    <div class="row">
        {%for articles in articles%}
          <div class="col-md-4 pt-4">
            <div class="card h-100">
                <img class="card-img-top" src="{{ articles.image.url }}" alt="Card image cap">
                <div class="card-body">
                    <a href="{% url 'article-detail' articles.id%}" class="article-title">{{articles.title}}</a>
                    <hr>
                    <p class="card-text">{{articles.content|safe|slice:":80"}}...</p>
                    <a class="btn btn-sm btn-outline-primary" href="{% url 'article-detail' articles.id%}">Read More...</a>
                </div>
            </div>
        </div>
        {%endfor%}
    </div>
    <!-- End of Row One of Articles -->


    <!-- Row Two of Articles -->
    <div class="row ">
        {% for articles_two in articles_two %}
          <div class="col-md-4 pt-4">
            <div class="card h-100">
                <img class="card-img-top" src="{{ articles_two.image.url }}" alt="Card image cap">
                <div class="card-body">
                    <a href="{% url 'article-detail' articles_two.id%}" class="article-title">{{articles_two.title}}</a><hr>
                    <p class="card-text">{{articles_two.content|safe|slice:":80"}}...</p>
                    <a class="btn btn-sm btn-outline-primary" href="{% url 'article-detail' articles_two.id%}">Read More...</a>
                </div>
            </div>
        </div>
        {% endfor %}
    </div>
    <!-- End of Row Two of Articles -->

    <br>
    <a style="float:right;" href="{%url 'articles' %}" class="btn btn-warning"> <i class="fas fa-angle-double-right"></i></a>
</div>
<!-- End of Latest Articles -->

<br><br><hr>

<section id="newsletter" class="newsletter">
    <h1 class="text-center">Subscribe to The Analyst Now</h1>
    <p class="text-center mb-3" style="color: grey;">Subscribe For Automatic Updates.</p>
    <div class="text-center">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">{{form.as_p}}
                <button class="btn btn-danger" type="submit">Subscribe</button>
            </fieldset>
        </form>
    </div>
    <br>
</section>


    <!-- Javascript Tags -->
    <script src="{% static 'blog/swiper.min.js' %}"></script>
    <script>
        var swiper = new Swiper('.swiper-container', {
          effect: 'coverflow',
          grabCursor: true,
          centeredSlides: true,
          slidesPerView: '1',

          autoplay: {
            delay: 3000,
            disableOnInteraction: false,
          },

          coverflowEffect: {
            stretch: 0,
            depth: 100,
            modifier: 1,
            slideShadows : true,
          },

          navigation: {
            nextEl: '.swiper-button-next',
            prevEl: '.swiper-button-prev',
          },
          pagination: {
            el: '.swiper-pagination',
          },
        });
      </script>
{%endblock%}

Tags: ofdivurltitlestaticsectionbuttoncard
2条回答

我认为这里发生了一些事情:

静态与媒体文件

只是想弄清楚区别。。。静态文件是代码库的一部分,包括用于站点设计的CSS文件、JavaScript文件和图像。只有当你做一些开发工作时,它们才会改变

媒体文件是通过管理员或用户使用的表单上传到站点的文件。e、 g.简介图片、书籍封面或博客文章中的图片

由于您对媒体文件的控制较少,因此通常会对它们进行不同的处理,因为存在稍高的安全风险,而且可能会有更多的媒体文件

地方发展

在本地开发期间(当您使用./manage.py runserver),Django的开发服务器应该能够毫无问题地同时提供静态和媒体文件。在本地工作时,不需要使用whitenoise。如果静态和/或媒体文件未加载,则可能是因为:

  • 设置(STATIC_ROOTMEDIA_ROOT)中的路径与静态和媒体目录的位置不匹配,或者
  • 尝试指向模板中的文件时出错

那么,在本地开发过程中,静态文件和媒体文件都没有加载吗?还是只有一个?在浏览器中查看页面的源代码,并查看其中文件的路径-它们是否符合您的预期

Heroku

Heroku没有持久文件系统,这意味着它不能提供媒体文件。因此,如果您或任何人通过网站上的表单上传一个新文件,而它最初可能会按预期加载,因为它已保存到磁盘,很快文件本身就会消失,不再加载到网站上。磁盘上保存的唯一文件是代码存储库中的文件

您使用whitenoise是正确的,但这只服务于项目的静态文件

要提供媒体文件,您需要使用django-storages并将文件托管在其他地方(如AmazonS3或django storages支持的其他服务)。这是一个真正的痛苦,令人恼火的是Heroku没有在他们的文档中解释这一点。如果你在谷歌上搜索(我以前使用过this one;我不知道它是否仍然有效),那么就有一些设置指南


除了上面提到的,我目前看到的文件结构的主要问题是article_picsmedia之外。我假设您有一个带有image字段的模型(Article?)?也许您已经将字段的upload_to参数设置为article_pics?在这种情况下,目录应该在media

在开发过程中,当您添加一篇新文章并上传一个图像时,您能在文件系统中看到它吗?它去哪里了

下面的内容将您的媒体目录完全置于项目之外

├───analyst

├───blog

│ ├───migrations

│ ├───static

│ │ ├───blog

│ │ └───images

│ ├───templates

│ │ └───blog

└───media

└───article_pics

请尝试更新到以下位置,然后再次运行collectstatic:

├───analyst

├───blog

│ ├───migrations

│ ├───static

│ │ ├───blog

│ │ └───images

│ ├───templates

│ │ └───blog

| └───media

| └───article_pics

相关问题 更多 >

    热门问题