Unterschied zwischen statischem STATIC_URL und STATIC_ROOT auf Django

126

Ich bin verwirrt von static root und möchte Dinge klären.

Um statische Dateien in Django bereitzustellen, sollte Folgendes in settings.pyund enthalten sein urls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)

1. Absoluter Pfad zu dem Verzeichnis, in dem statische Dateien gesammelt werden sollen

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. URL-Präfix für statische Dateien

STATIC_URL = '/static/'

3. Zusätzliche Speicherorte für statische Dateien

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... und in urls.pyfolgenden Zeilen:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. Wir verwenden auch python manage.py collectstatic

Fragen:

  1. Könnte mir bitte jemand den Workflow erklären: Wie sollte man idealerweise vorgehen? Ab sofort kopiere / füge ich die obigen Codefragmente an die angegebenen Speicherorte ein und erstelle weiterhin neue Dateien im statischen Verzeichnis, und es funktioniert. In meinem habe settings.STATIC_ROOTich jedoch auf ein anderes Verzeichnis verwiesen.

  2. Es wäre großartig, wenn jemand den Workflow jeder Einstellung erklären könnte: wie Dateien gesammelt und verwaltet werden und was eine gute Vorgehensweise wäre.

Vielen Dank.

user993563
quelle
Können Sie klarstellen, was Sie unter "Erklären des Workflows" verstehen? Außerdem sollten Ihre URL-Muster davon abhängig sein, ob Sie in Teil 3 entwickeln. Sie können dies tun, indem Sie hinzufügen, dass if settings.DEBUG:Django statische Medien nicht sehr gut bedient. Dies sollte einem echten Webserver überlassen bleiben.
dm03514
Hi @ user993563 Ich kann nicht einmal die Lösung in mehreren Foren finden, was ich will. aber Ihre Fragen erklären es klar, danke Mann ... tolle Arbeit ...
Mohideen bin Mohammed
Gute Erklärung, danke
Ajay Kumar

Antworten:

88

STATIC_ROOT

Der absolute Pfad zu dem Verzeichnis, in dem ./manage.py collectstaticstatische Dateien für die Bereitstellung erfasst werden. Beispiel:STATIC_ROOT="/var/www/example.com/static/"

Jetzt ./manage.py collectstatickopiert der Befehl alle statischen Dateien (dh im statischen Ordner in Ihren Apps, statische Dateien in allen Pfaden) in das Verzeichnis /var/www/example.com/static/. Jetzt müssen Sie dieses Verzeichnis nur noch auf Apache oder Nginx..etc bereitstellen.

STATIC_URL

Die URLstatischen Dateien im STATIC_ROOTVerzeichnis werden bereitgestellt (von Apache oder nginx..etc). Beispiel: /static/oderhttp://static.example.com/

Wenn Sie festlegen STATIC_URL = 'http://static.example.com/', müssen Sie den STATIC_ROOTOrdner (dh "/var/www/example.com/static/") per Apache oder Nginx unter URL bereitstellen 'http://static.example.com/'(damit Sie auf die statische Datei '/var/www/example.com/static/jquery.js'mit verweisen können 'http://static.example.com/jquery.js').

Jetzt können Sie in Ihren Django-Vorlagen darauf verweisen, indem Sie:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

was wird rendern:

<script src="http://static.example.com/jquery.js"></script>
suhailvs
quelle
1
Was ist der Unterschied zwischen Ihrem Beispiel und diesem: href = "{% static" jquery.js "%}"
Benutzer
8
@ Macdonjo beide {{ STATIC_URL }}jquery.jsund {% static "jquery.js" %}sind gleich. dh beide werden zurückkehren /static/jquery.js. Neuere Django- Versionen empfehlen die Verwendung {% static "jquery.js" %}, aber Sie müssen das Templatetag laden, dh {% load staticfiles %}. in älteren Django- Version empfiehlt{{STATIC_URL}}
suhailvs
Aha. Ich habe versucht, einen Fehler zu finden, der dazu führte, dass die meisten meiner Vorlagen mein Stylesheet mit Ausnahme einer Seite geladen haben. Ich habe es auf staticMethode anstatt auf STATIC_URLMethode umgestellt , und der Fehler war verschwunden. Guter Aufruf zu den Vorschlägen basierend auf Versionen.
Benutzer
36

STATICFILES_DIRS: Hier können Sie die statischen Dateien für Ihr Projekt aufbewahren, z. B. die von Ihren Vorlagen verwendeten.

STATIC_ROOT: Lassen Sie dies leer. Wenn Sie dies tun manage.py collectstatic, werden alle statischen Dateien auf Ihrem System gesucht und hierher verschoben. Ihr statischer Dateiserver soll diesem Ordner überall dort zugeordnet werden, wo er sich befindet. Überprüfen Sie dies, nachdem Sie collectstatic ausgeführt haben, und Sie werden feststellen, dass die Verzeichnisstruktur von django erstellt wurde.

--------Bearbeiten----------------

Wie von @DarkCygnus hervorgehoben, sollte STATIC_ROOT auf ein Verzeichnis in Ihrem Dateisystem verweisen. Der Ordner sollte leer sein, da er von Django gefüllt wird.

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

oder

STATIC_ROOT = '/opt/web/project/static_files'

-------- Edit beenden -----------------

STATIC_URL: '/ static /' ist normalerweise in Ordnung, es ist nur ein Präfix für statische Dateien.

Keni
quelle
2
Hier ist der Link zur statischen Dateiverwaltung in 1.3 docs.djangoproject.com/de/1.3/howto/static-files
Keni
2
STATICFILES_DIRSsollte als zusätzliches Verzeichnis für statische Dateien dienen. Wenn Sie alle Ihre css / js / images in den Ordner APP_NAME / static / APP_NAME legen, müssen Sie keine Angaben machen STATICFILES_DIRS.
laike9m
Danke für die Antwort, über die leeren Sie den STATIC_ROOT verlassen, hatte ich tatsächlich fest , in settings.py(indem STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) , bevor der collectstatic Befehl ausgeführt wird .
DarkCygnus
Hmm, ich kann sehen, wie leicht dies irreführend sein kann. Was ich damit meine, dass es leer bleibt, ist, dass es normalerweise leer anfängt und keine Dateien enthält. Ich werde die Antwort aktualisieren, um die Verwirrung zu beseitigen.
Keni
2

Alle obigen Antworten sind hilfreich, aber keine hat mein Problem gelöst. In meiner Produktionsdatei war meine STATIC_URLhttps://<URL>/static und ich habe dieselbe STATIC_URL in meiner Datei dev settings.py verwendet.

Dies führt zu einem stillen Fehler in django / conf / urls / static.py.

Der Test elif not settings.DEBUG or '://' in prefix: nimmt das '//' in der URL auf und fügt das statische URL-Muster nicht hinzu, sodass keine statischen Dateien gefunden werden.

Es wäre nachdenklich, wenn Django eine Fehlermeldung ausspucken würde, die besagt, dass Sie keine http(s)://mit verwenden könnenDEBUG = True

Ich musste STATIC_URL in '/ static /' ändern.

MIkee
quelle