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?

619voto

Dmitry Shevchenko Punkte 30176

Wenn Sie dennoch einen lokalen statischen Server benötigen (z. B. zum Testen ohne Debugging), können Sie devserver im unsicheren Modus ausführen:

manage.py runserver --insecure

491voto

Marek Sapota Punkte 19500

Wenn Debug deaktiviert ist, wird Django keine statischen Dateien mehr für Sie bearbeiten - Ihr Produktions-Webserver (Apache oder so) sollte sich darum kümmern.

119voto

stathoula Punkte 1340

In urls.py habe ich diese Zeile hinzugefügt:

from django.views.static import serve 

diese beiden URLs in urlpatterns hinzufügen:

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

und sowohl auf statische als auch auf Mediendateien konnte zugegriffen werden, wenn DEBUG=FALSE war.
Ich hoffe, es hilft :)

57voto

Johnny Zhao Punkte 2638

Sie können verwenden WhiteNoise um statische Dateien in der Produktion bereitzustellen.

Installieren:

pip install WhiteNoise==2.0.6

Und ändern Sie Ihre wsgi.py Datei zu dieser:

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

Und schon sind Sie startklar!

Kredit an Handlebar Creative Blog .

ABER, es ist wirklich nicht empfehlenswert, statische Dateien auf diese Weise in der Produktion bereitzustellen. Ihre Produktion Webserver (wie nginx) sollte sich darum kümmern, dass.

24voto

DarkCygnus Punkte 6624

Johnny's Antwort ist großartig, aber bei mir hat es trotzdem nicht funktioniert, nur weil ich die dort beschriebenen Zeilen hinzugefügt habe. Basierend auf dieser Antwort waren die Schritte, die bei mir tatsächlich funktionierten:

  1. Installieren Sie WhiteNoise wie beschrieben:

    pip install WhiteNoise
  2. Erstellen Sie die STATIC_ROOT Variable und fügen Sie WhiteNoise zu Ihrer MIDDLEWARE variabel in settings.py :

    #settings.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise
        'django.contrib.sessions.middleware.SessionMiddleware',
        ...
    ]
    
    #...
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ##specify static root
  3. Ändern Sie dann Ihre wsgi.py Datei, wie in Johnnys Antwort erläutert:

    #wsgi.py
    from django.core.wsgi import get_wsgi_application
    from whitenoise.django import DjangoWhiteNoise
    
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
  4. Danach stellen Sie Ihre Änderungen auf Ihrem Server bereit (mit git oder was auch immer Sie verwenden).

  5. Führen Sie schließlich die collectstatic Option von Ihrem manage.py auf Ihrem Server. Dies kopiert alle Dateien aus Ihren statischen Ordnern in den STATIC_ROOT Verzeichnis, das wir zuvor angegeben haben:

    $ python manage.py collectstatic

    Sie sehen nun einen neuen Ordner mit dem Namen staticfiles die solche Elemente enthält.

Nachdem Sie diese Schritte ausgeführt haben, können Sie nun Ihren Server starten und Ihre statischen Dateien im Produktionsmodus sehen.

Aktualisierung: Falls Sie die Version < 4 hatten, wird die Änderungsprotokoll zeigt an, dass es nicht mehr notwendig ist, die WSGI_APPLICATION = 'projectName.wsgi.application' zu Ihrem settings.py fichier.

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