web-dev-qa-db-ger.com

Warum schlägt die Einstellung DEBUG = False bei meinem Django Static Files Access fehl?

Ich erstelle eine App mit Django als Arbeitspferd. Bis jetzt waren alle Einstellungen in der Datenbank korrekt, statische Verzeichnisse, URLs, Ansichten usw. wurden konfiguriert meine eigenen schönen und benutzerdefinierten 404.html- und 500.html-Seiten.

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

Aber die Docs sagen you can actually view custom error views until Debug is Off, also habe ich es ausgeschaltet, um meine Sachen zu testen, und das ist, wenn Sachen wahnsinnig werden!

Ich kann die benutzerdefinierte 404.html nicht nur nicht anzeigen (tatsächlich wird sie geladen, sondern weil meine Fehlerseiten jeweils eine grafische Fehlermeldung enthalten - wie ein nettes Bild), wird die Quelle der Fehlerseite geladen, aber es wird nichts anderes geladen! Nicht einmal verlinktes CSS oder Javascript!

Im Allgemeinen, sobald ich DEBUG = False, alle Ansichten werden geladen, aber alle verknüpften Inhalte (CSS, Javascript, Bilder usw.) werden nicht geladen! Was ist los? Fehlt etwas in Bezug auf statische Dateien und die Einstellung DEBUG?

307
nemesisfixx

Bei deaktiviertem Debug Django behandelt keine statischen Dateien mehr für Sie - Ihr Produktions-Webserver (Apache oder so) sollte sich darum kümmern.

303
Marek Sapota

Wenn Sie weiterhin statische Daten lokal servern müssen (z. B. zum Testen ohne Debugging), können Sie devserver im unsicheren Modus ausführen:

manage.py runserver --insecure
428

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

Installieren:

pip install WhiteNoise

Und ändere deine wsgi.py Datei so:

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

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

Und du bist gut zu gehen!

Dank an Lenker-Creative-Blog .

ABER es wird wirklich nicht empfohlen, statische Dateien auf diese Weise in der Produktion bereitzustellen. Ihr Produktions-Webserver (wie Nginx) sollte sich darum kümmern.

28
Johnny Zhao

Wenn Sie die statische Serve-Ansicht in der Entwicklung verwenden, muss DEBUG = True sein:

Warnung

Dies funktioniert nur, wenn DEBUG True ist.

Das liegt daran, dass diese Ansicht äußerst ineffizient und wahrscheinlich unsicher ist. Dies ist nur für die lokale Entwicklung gedacht und sollte niemals in der Produktion verwendet werden.

Docs: Bereitstellen statischer Dateien in Developent

BEARBEITEN: Sie können einige URLs hinzufügen, um Ihre 404- und 500-Vorlagen zu testen. Verwenden Sie dazu einfach die generische Ansicht direct_to_template in Ihren URLs.

from Django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    ('^404testing/$', direct_to_template, {'template': '404.html'})
)
17
j_syk

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

from Django.views.static import serve 

füge diese beiden URLs in die URL-Muster ein:

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

und sowohl statische als auch Mediendateien waren zugänglich, wenn DEBUG = FALSE.
Ich hoffe es hilft :)

13
stathoula

Sie können tatsächlich statische Dateien in einer Production Django App, sicher und ohne DEBUG=True.

Anstatt Django selbst zu verwenden, verwenden Sie dj_static in Ihrer WSGI-Datei ( github ):

# requirements.txt:

...
dj-static==0.0.6


# YOURAPP/settings.py:

...
STATIC_ROOT = 'staticdir'
STATIC_URL = '/staticpath/'

# YOURAPP/wsgi.py:

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

application = Cling(get_wsgi_application())
11
Robin Winslow

Johnny's Antwort ist großartig, hat aber trotzdem nicht funktioniert, wenn ich die dort beschriebenen Zeilen hinzugefügt habe. Basierend auf dieser Antwort waren die Schritte, die für mich tatsächlich funktionierten, folgende:

  1. Installieren Sie WhiteNoise wie beschrieben:

    pip install WhiteNoise
    
  2. Erstellen Sie die Variable STATIC_ROOT Und fügen Sie Ihrer Variablen MIDDLEWARE in settings.py WhiteNoise hinzu:

    #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 erklärt:

    #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 abschließend die Option collectstatic in Ihrem manage.py Auf Ihrem Server aus. Dadurch werden alle Dateien aus Ihren statischen Ordnern in das zuvor angegebene Verzeichnis STATIC_ROOT Kopiert:

    $ python manage.py collectstatic
    

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

Nachdem Sie diese Schritte ausgeführt haben, können Sie Ihren Server jetzt ausführen und Ihre statischen Dateien im Produktionsmodus anzeigen.

Update: Falls Sie Version <4 hatten, zeigt das Changelog an, dass es nicht mehr notwendig ist, den WSGI_APPLICATION = 'projectName.wsgi.application' in Ihrer settings.py - Datei.

11
DarkCygnus

Öffnen Sie einfach die Datei 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, sollten Sie über andere Lösungen nachdenken, die oben erwähnt wurden.

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

In Django 1.10 können Sie Folgendes schreiben:

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

Sie können dies auf viele verschiedene Arten debuggen. Hier ist mein Ansatz.

localsettings.py:

DEBUG = False
DEBUG404 = True

urls.py:

from Django.conf import settings
import os

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'Django.views.static.serve',
         {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
    )

Lesen Sie unbedingt die Dokumentation;)

https://docs.djangoproject.com/de/2.0/howto/static-files/#limiting-use-to-debug-true

5
Conrado

Ich hatte gerade ein ähnliches Problem: nicht statische Dateien auf Heroku mit DEBUG = False laden.


Lösung

Auf production.py:

STATIC_ROOT = 'static'

Bereitgestellt und gerade gearbeitet (ich benutze dj_static, wie von Robin Winslow erklärt).

1
gabriel

Es ist zwar nicht sicherer, aber Sie können den Quellcode ändern. navigiere zu Python/2.7/site-packages/Django/conf/urls/static.py

Dann bearbeiten Sie wie folgt:

if settings.DEBUG or (prefix and '://' in prefix):

Also, wenn settings.debug==False es wirkt sich nicht auf den Code aus, auch nach dem Ausführen von try python manage.py runserver --runserver, um statische Dateien auszuführen.

NOTE : Informationen sollten nur zu Testzwecken verwendet werden

0
Natuto

Die Unterstützung von Zeichenfolgenansichtsargumenten für url () ist veraltet und wird in Django 1.10 entfernt

Meine Lösung ist nur eine kleine Korrektur der obigen Conrado-Lösung.

from Django.conf import settings
import os
from Django.views.static import serve as staticserve

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', staticserve,
            {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
        )
0
be_good_do_good

Ich habe die folgenden Änderungen an meinem Projekt/urls.py vorgenommen und es hat bei mir funktioniert

Füge diese Zeile hinzu: von Django.conf.urls import url

und füge hinzu: url (r '^ media/(? P. *) $', serve, {'document_root': settings.MEDIA_ROOT,}), in urlpatterns.

0
Namrata Sharma