517 Stimmen

Warum führt die Einstellung DEBUG=False dazu, dass der Zugriff auf statische Dateien in Django fehlschlägt?

Ich baue eine App mit Django als mein Arbeitspferd. Alles war gut so weit - angegeben db-Einstellungen, konfiguriert statische Verzeichnisse, Urls, Ansichten etc. Aber Ärger begann schleichen in dem Moment wollte ich meine eigenen schönen und benutzerdefinierten 404.html und 500.html Seiten zu machen.

Ich habe die Dokumente zur benutzerdefinierten Fehlerbehandlung gelesen und die erforderlichen Konfigurationen in UrlsConf festgelegt, entsprechende Ansichten erstellt und die 404.html und die 500.html zum Vorlagenverzeichnis meiner App hinzugefügt (auch in der settings.py angegeben).

Aber die Ärzte sagen you can actually view custom error views until Debug is Off also habe ich es ausgeschaltet, um meine Sachen zu testen, und dann geht alles drunter und drüber!

Nicht nur, dass ich die benutzerdefinierte 404.html nicht anzeigen kann (sie wird zwar geladen, aber da meine Fehlerseiten jeweils eine grafische Fehlermeldung enthalten - als nettes Bild), wird die Quelle der Fehlerseite geladen, aber sonst nichts! Nicht einmal verknüpfte CSS oder Javascript!

In der Regel, sobald ich die DEBUG = False Alle Ansichten werden geladen, aber alle verlinkten Inhalte (CSS, Javascript, Bilder, etc.) werden nicht geladen! Was ist da los? Gibt es etwas, das ich übersehe, in Bezug auf statische Dateien und die DEBUG Einstellung?

6voto

Sergey Luchko Punkte 2576

Für die letzten Versionen von Django sehen Sie sich bitte die Antwort hier an: https://stackoverflow.com/a/7639983/6180987

Für Django-Versionen unter 1.10 sollte die Lösung funktionieren:

Öffnen Sie einfach Ihr Projekt urls.py und suchen Sie diese if-Anweisung.

if settings.DEBUG:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

Sie können settings.DEBUG auf True ändern und es wird immer funktionieren. Aber wenn Ihr Projekt etwas Ernstes ist, dann sollten Sie über andere oben genannte Lösungen nachdenken.

if True:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

In django 1.10 können Sie so schreiben:

urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]

6voto

Genau das müssen Sie im Terminal eingeben, um Ihr Projekt ohne DEBUG = TRUE auszuführen und dann sehen Sie, dass alle (statischen) Dateien korrekt auf den lokalen Server geladen werden.

python manage.py runserver --insecure 

--insecure : Das bedeutet, dass Sie den Server ohne Sicherheitsmodus betreiben können.

4voto

PaxPrz Punkte 1603

Ich stimme mit Marek Sapkota Antwort; Aber Sie können noch django verwenden URFConf um die Url neu zuzuweisen, wenn eine statische Datei angefordert wird.

Schritt 1: Definieren Sie eine STATIC_ROOT Pfad in settings.py

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

Schritt 2: Sammeln Sie dann die statischen Dateien

$ python manage.py collectstatic

Schritt 3: Definieren Sie nun Ihre URLConf so, dass, wenn static am Anfang der URL steht, auf Dateien aus dem Ordner static zugegriffen wird staticfiles . HINWEIS: Dies ist die Datei urls.py für Ihr Projekt:

from django.urls import re_path
from django.views.static import serve

urlpattern += [
  re_path(r'^static/(?:.*)$', serve, {'document_root': settings.STATIC_ROOT, })
]

4voto

Wenn ich DEBUG = True meine Statik funktioniert nicht.

wenn ich mein Projekt in python manage.py runserver --insecure . Dadurch habe ich auch meine Statik bekommen.

Lösung 1:

python manage.py runserver --insecure

Lösung 2:

Aber ich brauche eine dauerhafte Lösung, dann installiere ich pip install dj-static==0.0.6 und fügen Sie meiner Datei wsgi.py etwas Code hinzu:

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

und dann habe ich einige in setting.py hinzugefügt:

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

3voto

Destiny Franks Punkte 828

Ich habe dieses Problem heute und dies behoben, während auf die Entwicklung, Wenn Sie noch benötigen, um statische Server lokal (z. B. für Tests ohne Debug) können Sie devserver im unsicheren Modus ausführen:

manage.py runserver --insecure

Machen Sie sich keine Sorgen, denn in der Produktion würde diese Hosting-Plattform (Apache, Heroku usw.) die statischen Dateien für Sie bereitstellen.

Hinweis: Heroku ist kein Server für statische Dateien, Sie sollten es auf AWS oder MS Azure stellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X