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.js
zu STATIC_ROOT/admin/custom.js
, aber es funktioniert nicht. Werfen 404 nicht gefunden Fehler.
Und dann ändere ich das STATIC_ROOT
auf STATICFILES_DIRS
und 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_ROOT
und ist STATICFILES_DIRS
.
Derzeit teste ich Django auf meinem Computer über virtualenv, noch nicht bereitgestellt. Funktioniert das STATIC_ROOT
nicht?
Antworten:
Sie finden diese Einstellungen in der Django-Dokumentation . Hier sind meine eigenen Definitionen und Zitate aus der Dokumentation:
MEDIA_ROOT
ist der Ordner, in den hochgeladene Dateien verschobenFileField
werden.STATIC_ROOT
ist der Ordner, in dem statische Dateien nach der Verwendung gespeichert werdenmanage.py collectstatic
STATICFILES_DIRS
ist die Liste der Ordner, in denen Django neben demstatic
Ordner jeder installierten App nach zusätzlichen statischen Dateien sucht .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:
wie
settings.py
jetzt im Standard-Django definiert .quelle
Entwicklung
STATIC_ROOT
ist während der Entwicklung nutzlos und nur für die Bereitstellung erforderlich.Während der Entwicklung
STATIC_ROOT
tut 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 runserver
wannDEBUG=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_ROOT
wird 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 Siemanage.py collectstatic
und Django kopiert statische Dateien von allen Apps, die Sie benötigen/some/folder/
.Zusätzliche Verzeichnisse für statische Dateien
STATICFILES_DIRS
wird verwendet, um zusätzliche Verzeichnisse einzuschließen,collectstatic
nach 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/'), ]
quelle
Unterschied zwischen
STATICFILES_DIRS
undSTATIC_ROOT
Das
STATICFILES_DIRS
kann andere Verzeichnisse (nicht unbedingt App-Verzeichnisse) mit statischen Dateien enthalten. Diese statischen Dateien werden beim Ausführen in Ihrem STATIC_ROOT gesammeltcollectstatic
. 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
. IhrSTATIC_ROOT
Verzeichnis sollte leer sein und alle statischen Dateien sollten in diesem Verzeichnis gesammelt werden.MEDIA_ROOT
Wo Mediendateien, gehen alle hochgeladenen Dateien. Beispiel: Bilder, Dateienquelle