[英]Heroku Django Images not loading
幾個小時以來一直試圖解決這個問題,似乎無法解決這個問題。 我安裝了白噪聲,除了圖像未加載外,網站運行良好。 這是我的媒體代碼:
├────.idea
├────分析師
│ └─── pycache
├───博客
│ ├───遷移
│ │ └─── pycache
│ ├───靜態
│ │ ├───博客
│ │ └───圖片
│ ├───模板
│ │ └───博客
│ └─── pycache
└────媒體
└────article_pics
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%}
我認為這里發生了一些事情:
Static 與媒體文件
只是要清楚區別... Static 文件是您的代碼庫的一部分,包括 CSS 文件、JavaScript 文件和用於您網站設計的圖像等內容。 只有當您進行一些開發工作時,它們才會發生變化。
媒體文件是通過管理員或通過您制作的用戶使用的表單上傳到您網站的文件。 例如,個人資料圖片、書籍封面或博客文章中的圖片。
由於您對媒體文件的控制較少,因此它們通常會受到不同的處理,因為安全風險略高,而且可能還有更多。
地方發展
在本地開發期間(當您使用./manage.py runserver
時)Django 的開發服務器應該毫無問題地同時提供 Static 和媒體文件。 在本地工作時,您不需要使用白噪聲。 如果 static 和/或媒體文件未加載,則可能是因為:
STATIC_ROOT
, MEDIA_ROOT
)與您的 static 和媒體目錄的位置不匹配,或者那么,在本地開發過程中,static 和媒體文件都沒有加載嗎? 或者只是一個或另一個? 在瀏覽器中查看頁面的源代碼並查看那里的文件路徑 - 它們是您所期望的嗎?
Heroku
Heroku 沒有持久文件系統,這意味着它無法提供媒體文件。 因此,如果您或任何人通過網站上的表單上傳新文件,雖然它最初可能會按預期加載,因為它已保存到磁盤,但文件本身很快就會消失並且不再在網站上加載。 唯一保留在磁盤上的文件是那些屬於您的代碼存儲庫的文件。
您使用白噪聲是正確的,但這只會服務於您項目的 Static 文件。
要提供媒體文件,您需要使用django-storages並將文件托管在其他地方(如 Amazon S3,或 django-storages 支持的不同服務)。 這是一個真正的痛苦,令人討厭的是 Heroku 沒有在他們的文檔中解釋這一點。 如果你用谷歌搜索的話,有一些設置指南(我以前用過這個;我不知道它是否仍然有效)。
除上述內容外,我目前在您的文件結構中看到的主要問題是article_pics
在media
之外。 我假設您有一個帶有image
字段的 model( Article
?)? 也許您已將該字段的upload_to
參數設置為article_pics
? 在這種情況下,該目錄應該在media
中。
當您添加新文章並上傳圖片時,在開發過程中,您可以在文件系統中看到它嗎? 它在哪里 go?
下面的媒體目錄完全在項目之外。
├───analyst
├───blog
│ ├───migrations
│ ├───static
│ │ ├───blog
│ │ └───images
│ ├───templates
│ │ └───blog
└───media
└───article_pics
請嘗試更新到以下內容並再次運行 collectstatic:
├───analyst
├───blog
│ ├───migrations
│ ├───static
│ │ ├───blog
│ │ └───images
│ ├───templates
│ │ └───blog
| └───media
| └───article_pics
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.