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?

20voto

j_syk Punkte 6331

Wenn Sie die statische Serve-Ansicht in der Entwicklung verwenden, müssen Sie DEBUG = True einstellen:

Warnung

Dies funktioniert nur, wenn DEBUG True ist.

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

Docs: Bereitstellung statischer Dateien in der Entwicklung

EDIT: Sie könnten einige URLs hinzufügen, um Ihre 404- und 500-Vorlagen zu testen, verwenden Sie 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'})
)

16voto

Robin Winslow Punkte 10050

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

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

Anforderungen.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())

12voto

Anny Punkte 93

Von hier aus habe ich Hilfe geholt, indem ich ein paar Antworten gemischt habe. Hier füge ich meine ganzen Teile hinzu. (Ich tue dies, um Anfängern zu helfen und auch für meinen zukünftigen Gebrauch)

Zunächst einmal stellt sich die Frage, warum Debug=False benötigt! Ich legte mein Projekt in AWS und es wurde Verbindung Timeout nach wenigen Stunden wegen Speicherlecks. Zuerst dachte ich für Sellerie. (natürlich bin ich nur ein Anfänger) Dann habe ich DEBUG=False von DEBUG=True Wie wir die Sicherheitswarnung in settings.py sehen können

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

Sobald ich das getan habe, wurden meine statischen Dateien nicht mehr erfolgreich in Webseiten geladen. Dann habe ich überall gesucht und zunächst von hier aus den Befehl --insecure an runserver ausprobiert.

python manage.py runserver --insecure

Das ist erfolgreich, aber ich möchte den unsicheren Modus nicht in meinem Projekt haben, wenn es in Produktion ist. Und als die richtige Lösung [meiner Meinung nach] habe ich die folgenden Schritte befolgt.

Zuerst korrigiere ich die statische URL, Root und dir in einstellungen.py

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

Dann sammeln Sie die statischen Dateien mit dem Befehl

python manage.py collectstatic

Nun der zweite Schritt, [der auch hier vorgesehen ist] Installieren Sie zunächst whitenoise in Ihrem Projektverzeichnis über die Kommandozeile

pip install whitenoise

Fügen Sie dann 'whitenoise.middleware.WhiteNoiseMiddleware' in Ihre Middleware-Liste in settings.py ein.

Diese sollte direkt unter der "django.middleware.security.SecurityMiddleware" und über allen anderen Middlewares eingefügt werden. Damit Ihre Middleware-Liste wie folgt aussieht:-

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', #after this line
    'whitenoise.middleware.WhiteNoiseMiddleware', #add it exactlyhere
    'django.contrib.sessions.middleware.SessionMiddleware', #before this
    '...'
]

Fügen Sie 'whitenoise.runserver_nostatic' zu den installierten Anwendungen hinzu, so dass die Liste der installierten Anwendungen wie folgt aussehen wird:-

INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    'django.contrib.admin',
    'django.contrib.auth',
    '...'
]

Fertig, Sie können jetzt statische Dateien in der Produktion bereitstellen!! [Das habe ich auch in meiner lokalen Umgebung getan].

Verwenden Sie einfach den runserver-Befehl wie immer keine unsicheren oder irgendetwas benötigt.

python manage.py runserver

Bumm!!! Es funktioniert bei mir. Hahaha. Ich weiß, das ist etwas kindisch, aber ich bin jetzt so glücklich.

Vielen Dank an alle, die hier Antworten gegeben haben und mir bei meiner Arbeit helfen.

9voto

Chhinna Punkte 61

Die ultimative Lösung:-
Also grundsätzlich, wenn Sie debug = False, Django nicht wollen, um Ihre statischen Dateien zu kümmern.
Wir wollen also etwas, das sich um unsere Dateien kümmern kann.
Die Antwort lautet: Weißrauschen.

  1. pip install whitenoise in Ihrem Umfeld

  2. hinzufügen whitenoise.middleware.WhiteNoiseMiddleware'. in Ihrer Middleware-Liste in settings.py.

    Dies sollte direkt unter der django.middleware.security.SecurityMiddleware'. und vor allem die übrige Middleware. Damit Ihre Middleware-Liste wie folgt aussieht:-

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware',
        # add it exactlyhere
        'django.contrib.sessions.middleware.SessionMiddleware',
        '...'
    ]
  3. hinzufügen whitenoise.runserver_nostatic' zusätzlich zu Ihren installierten Anwendungen Damit die Liste der installierten Anwendungen wie folgt aussieht:-

    INSTALLED_APPS = [
        'whitenoise.runserver_nostatic',
        'django.contrib.admin',
        'django.contrib.auth',
        '...'
    ]

Fertig, Sie können jetzt statische Dateien in der Produktion bereitstellen!

7voto

Conrado Punkte 1373

Sie können dies auf viele verschiedene Arten beheben. 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 Dokumente ;)

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

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