2017-01-23 2 views
2

Ich habe die folgende Struktur in meinem Django-Projekt. Wie Sie sehen können, gibt es eine App namens "Blog" sowie die Haupt-App, die mit dem Projekt selbst benannt ist. Django Project Serving statische Dateien mit mehreren Apps

enter image description here

Das Problem Ich habe hat mit dienen statische Dateien aus dem static Verzeichnis des Hauptprojektes zu tun. Die App blog hat ihr eigenes Verzeichnis static, und diese Dateien werden ordnungsgemäß bereitgestellt (wenn die relevanten URL-Routen durchlaufen werden).

Kann mir jemand sagen, was ich falsch mache? Was ist die beste Vorgehensweise beim Bereitstellen von statischen Dateien im Umgang mit mehreren Apps? Ist es ratsam, alle Stile und Skripte im Stammverzeichnis des Projekts in ein gemeinsames Verzeichnis static zu übertragen oder ist es besser, die Dinge vollständig von App zu App getrennt zu halten?

settings.py

import os 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

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

urls.py

urlpatterns = [ 
    url(r'^$', TemplateView.as_view(template_name="base.html")), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')), 
] 

base.html

{% load staticfiles %} 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 
    <title>Home | Triangle</title> 
    <link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/font-awesome.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/animate.min.css" %}" rel="stylesheet"> 
    <link href="{% static "css/lightbox.css" %}" rel="stylesheet"> 
    <link href="{% static "css/main.css" %}" rel="stylesheet"> 
    <link href="{% static "css/responsive.css" %}" rel="stylesheet"> 

    <!--[if lt IE 9]> 
     <script src="{% static "js/html5shiv.js" %}></script> 
     <script src="{% static "js/respond.min.js" %}"></script> 
    <![endif]-->  
    <link rel="shortcut icon" href="{% static "images/ico/favicon.ico" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="{% static "images/ico/apple-touch-icon-144-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="{% static "images/ico/apple-touch-icon-114-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="{% static "images/ico/apple-touch-icon-72-precomposed.png" %}"> 
    <link rel="apple-touch-icon-precomposed" href="{% static "images/ico/apple-touch-icon-57-precomposed.png" %}"> 
</head><!--/head--> 

<body> 

Antwort

1

„Dumping alle Stile und Skripte in ein gemeinsames statisches Verzeichnis "ist genau das, was der collectstatic Befehl tut. Sie sollten das ausführen und Ihren Server so konfigurieren, dass er die Dateien von dort aus bereitstellt.

Zunächst sollten Sie jedoch Ihre STATIC_ROOT-Einstellung so festlegen, dass sie auf dieses gemeinsame Verzeichnis verweist und nicht in Ihrer App.

+1

Könnten Sie erarbeiten in Ihrer Basis geben? – MadPhysicist

+0

Ähm, worüber besonders? –

+0

Wo wird der Befehl ausgeführt, wie wird der Code repariert? Ich würde das nicht fragen, wenn ich über den Rahmen sehr gut informiert wäre. – MadPhysicist

1

STATIC_ROOT gibt den Ordner, in dem alle statischen Dateien abgeladen werden, wenn Sie den Befehl collectstatic

laufen
python manage.py collectstatic 

Sie scheinen als static_root angegeben einen Ihrer App statischer Ordner zu haben.

Es wäre besser, einen anderen Ordner für alle statischen Dateien anzugeben.

STATIC_ROOT = os.path.join(BASE_DIR, "static") 

beim Ausführen des collectstatic Befehls es all Ihre statischen Dateien sammeln würde und sie in den static_root Ordner.

Obwohl, während Sie in DEBUG = True ausgeführt werden, brauchen Sie sich darüber keine Gedanken zu machen. Django liefert den gesamten statischen Inhalt (einschließlich aus einzelnen Apps), aber in einer Produktionsumgebung wird dies nicht empfohlen und es wäre die Aufgabe des Webservers, statischen Inhalt zu liefern.

EDIT:

Sie müssen auch urls.py

from django.conf.urls.static import static 
from django.conf import settings 

if settings.DEBUG: 
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 
+0

Das Problem ist, dass dies nicht funktioniert. Wenn ich 'STATIC_ROOT' auf die gleiche Weise wie Sie angegeben habe, werden meine CSS-Dateien immer noch nicht gefunden. Gibt es eine Möglichkeit, das zu testen? Außerdem verstehe ich richtig, dass 'collectstatic' statische Ordner in jeder App ansieht und sie physisch in die von' STATIC_ROOT' definierten Bereiche verschiebt? – MadPhysicist

+0

Ja, collectstatic betrachtet alle statischen Ordner in jeder App und verschiebt sie in den Ordner, der durch static_root angegeben wird. In Ihrem Browser überprüfen Sie die URL für die CSS-Dateien in der Quelle und sehen, ob es mit dem übereinstimmt, was erwartet wird? – at14

+1

URLs kommen wie folgt aus "/static/css/bootstrap.min.css", aber sie können nicht gefunden werden. Ich bin mir zu diesem Zeitpunkt nicht sicher, was Django als Hauptpunkt der Anwendung behandelt. – MadPhysicist

Verwandte Themen