Unterschiede zwischen STATICFILES_DIR, STATIC_ROOT und MEDIA_ROOT


77

Was sind die Unterschiede dieser drei statischen URLs?

Ich bin mir nicht sicher, ob ich Recht habe. Ich verwende das MEDIA_ROOT, um meine hochgeladenen Fotos zu speichern (via models.ImageField()).

Ich habe jedoch ein JS-Skript für meinen Administrator und in erstellt admin.py. Ich habe die Medien wie folgt definiert:

....
class Media:
      js = ('/admin/custom.js', )

und mein settings.py:

 ....
 STATIC_ROOT = "/home/user/project/django1/top/listing/static"

und ich fügte die custom.jszu STATIC_ROOT/admin/custom.js, aber es funktioniert nicht. Werfen 404 nicht gefunden Fehler.

Und dann ändere ich das STATIC_ROOTauf STATICFILES_DIRSund es funktioniert !!

....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"

Ich verstehe also nicht, was hier los ist. Tatsächlich verstehe ich einfach nicht, was der Unterschied zwischen STATIC_ROOTund ist STATICFILES_DIRS.

Derzeit teste ich Django auf meinem Computer über virtualenv, noch nicht bereitgestellt. Funktioniert das STATIC_ROOTnicht?


1
Siehe auch eine Grafik, die ich über die Funktionsweise statischer Dateien in der Produktion erstellt habe: djangodeployment.com/2016/11/21/…
Antonis Christofides

Antworten:


114

Sie finden diese Einstellungen in der Django-Dokumentation . Hier sind meine eigenen Definitionen und Zitate aus der Dokumentation:

  • MEDIA_ROOTist der Ordner, in den hochgeladene Dateien verschoben FileFieldwerden.

    Absoluter Dateisystempfad zu dem Verzeichnis, in dem vom Benutzer hochgeladene Dateien gespeichert werden .

  • STATIC_ROOT ist der Ordner, in dem statische Dateien nach der Verwendung gespeichert werden manage.py collectstatic

    Der absolute Pfad zu dem Verzeichnis, in dem collectstaticstatische Dateien für die Bereitstellung erfasst werden.

    Wenn die staticfilesContrib-App aktiviert ist (Standard) collectstatic, sammelt der Verwaltungsbefehl statische Dateien in diesem Verzeichnis. Weitere Informationen zur Verwendung finden Sie in der Anleitung zum Verwalten statischer Dateien.

  • STATICFILES_DIRSist die Liste der Ordner, in denen Django neben dem staticOrdner jeder installierten App nach zusätzlichen statischen Dateien sucht .

    Diese Einstellung definiert die zusätzlichen Standorte der Static App wird durchlaufen , wenn der FileSystemFinderFinder aktiviert ist, zB wenn Sie die Verwendung collectstaticoder findstaticVerwaltungsbefehl oder verwenden Sie die statische Datei dienen Ansicht.

In Ihren Einstellungen sollten Sie Folgendes haben:

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

# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )

...wo:

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

wie settings.pyjetzt im Standard-Django definiert .


3
Dies ist mit Sicherheit die klarste Antwort IMO, obwohl ich der Meinung bin, dass diese Frage definitiv betrogen ist
Ian Clark

3
@ MaximeLorant Ehrlich gesagt ist Ihre Erklärung besser als die der Django-Dokumente.
Jee

1
@ MaximeLorant wunderschön konstruierte Antwort. Wie Jee erwähnte, viel klarer als die Dokumente selbst.
Neil Hickman

122

Entwicklung

STATIC_ROOT ist während der Entwicklung nutzlos und nur für die Bereitstellung erforderlich.

Während der Entwicklung STATIC_ROOTtut nichts. Sie müssen es nicht einmal einstellen. Django sucht im Verzeichnis ( myProject/appName/static) jeder App nach statischen Dateien und stellt sie automatisch bereit.

Dies ist die Magie, bis manage.py runserverwann DEBUG=True.

Einsatz

Wenn Ihr Projekt live geht, sind die Dinge anders. Höchstwahrscheinlich werden Sie dynamische Inhalte mit Django bereitstellen und statische Dateien werden von Nginx bereitgestellt. Warum? Weil Nginx unglaublich effizient ist und die Arbeitsbelastung von Django reduziert.

Hier STATIC_ROOTwird es praktisch, da Nginx nichts über Ihr Django-Projekt weiß und nicht weiß, wo statische Dateien zu finden sind.

Sie legen STATIC_ROOT = '/some/folder/'Nginx fest und weisen ihn an, nach statischen Dateien in zu suchen /some/folder/. Dann laufen Sie manage.py collectstaticund Django kopiert statische Dateien von allen Apps, die Sie benötigen /some/folder/.

Zusätzliche Verzeichnisse für statische Dateien

STATICFILES_DIRSwird verwendet, um zusätzliche Verzeichnisse einzuschließen, collectstaticnach denen gesucht werden soll. Zum Beispiel erkennt Django standardmäßig nicht /myProject/static/. So können Sie es selbst einschließen.

Beispiel

STATIC_URL = '/static/'

if not DEBUG: 
    STATIC_ROOT = '/home/django/www-data/site.com/static/'

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

18
Beste Erklärung für STATIC_ROOT usw. Klar und prägnant. Dies sollte in der Django-Dokumentation enthalten sein.
Homunculus Reticulli

1
@ Max Malysh das ist die Ebene der Antwort, die wir haben sollten. Ich habs! A +
adhg

1
Viel Aufklärung. Vielen Dank!
MadPhysicist

23

Unterschied zwischen STATICFILES_DIRSundSTATIC_ROOT

Das STATICFILES_DIRSkann andere Verzeichnisse (nicht unbedingt App-Verzeichnisse) mit statischen Dateien enthalten. Diese statischen Dateien werden beim Ausführen in Ihrem STATIC_ROOT gesammelt collectstatic. Diese statischen Dateien werden dann von Ihrem Webserver bereitgestellt und von Ihrem STATIC_ROOT.

Wenn Sie derzeit Dateien in Ihrem STATIC_ROOT haben, die Sie bereitstellen möchten, müssen Sie diese in ein anderes Verzeichnis verschieben und dieses andere Verzeichnis ablegen STATICFILES_DIRS. Ihr STATIC_ROOTVerzeichnis sollte leer sein und alle statischen Dateien sollten in diesem Verzeichnis gesammelt werden.

MEDIA_ROOTWo Mediendateien, gehen alle hochgeladenen Dateien. Beispiel: Bilder, Dateien


4
Danke für die Antwort. Ich wünschte, ich könnte mehr als eine Antwort auf die Frage akzeptieren. Ihre Antwort ist mir auch sehr hilfreich.
Dev-Jim
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.