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
?
Bei deaktiviertem Debug Django behandelt keine statischen Dateien mehr für Sie - Ihr Produktions-Webserver (Apache oder so) sollte sich darum kümmern.
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
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.
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'})
)
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 :)
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())
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:
Installieren Sie WhiteNoise wie beschrieben:
pip install WhiteNoise
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
Ä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)
Danach stellen Sie Ihre Änderungen auf Ihrem Server bereit (mit Git oder was auch immer Sie verwenden).
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.
Ö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 }), ]
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
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).
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
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')} ),
)
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.