Pourquoi DEBUG=False setting fait-il échouer mon accès aux fichiers statiques de django?
je construis une application utilisant Django comme mon cheval de travail. Tout a été bien jusqu'à présent - paramètres de base de données spécifiés, répertoires statiques configurés, urls, vues, etc. Mais les problèmes ont commencé à se faufiler au moment où je voulais rendre mon propre beau et personnalisé 404.html et 500.les pages html.
j'ai lu les docs sur la gestion des erreurs personnalisées, et défini les configurations nécessaires dans UrlsConf, créé les vues correspondantes et ajouté le 404.html et les 500.html dans le répertoire des modèles de mon application (spécifié dans la settings.py trop).
mais les docs disent you can actually view custom error views until Debug is Off
, donc je l'ai éteint pour tester mes affaires, et c'est là que les choses deviennent fougueuses!
non seulement je ne vois pas le custom 404.html (en fait, il charge, mais parce que mes pages d'erreur contiennent chacune un message d'erreur graphique-comme une image agréable), la source de la page d'erreur charge, mais rien d'autre charge! Pas même lié CSS ou Javascript!
en général, une fois que j'ai mis DEBUG = False
, toutes les vues se chargeront, mais tout contenu lié (CSS, Javascript, Images, etc) ne se chargera pas! Ce qui se passe? Y a-t-il quelque chose qui manque, concernant les fichiers statiques et le paramètre DEBUG
?
11 réponses
avec debug éteint Django ne sera pas gérer les fichiers statiques pour vous plus - votre serveur web de production (Apache ou quelque chose) devrait prendre soin de cela.
si vous avez encore besoin de serveurs statiques localement (par exemple pour les tests sans débogage), vous pouvez exécuter devserver en mode non sécurisé:
manage.py runserver --insecure
vous pouvez utiliser WhiteNoise pour servir des fichiers statiques en production.
Installation:
pip install WhiteNoise
Et de changer votre wsgi.py fichier:
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
et vous êtes prêt à partir!
crédit à Handlebar Creative Blog .
mais, il est vraiment pas recommandé de servir des fichiers statiques de cette façon dans production. Votre serveur web de production (comme nginx) devrait s'en charger.
si vous utilisez la vue de service statique dans le développement, vous devez avoir DEBUG = True:
Avertissement
cela ne fonctionnera que si le débogage est vrai.
c'est parce que cette vue est grossièrement inefficace et probablement d'insécurité. Ce service est uniquement destiné aux développement, et ne devrait jamais être utilisé dans la production.
Docs: servir les fichiers statiques en développement
EDIT: vous pouvez ajouter des urls juste pour tester vos modèles 404 et 500, utilisez simplement la vue générique direct_to_template dans vos urls.
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
('^404testing/$', direct_to_template, {'template': '404.html'})
)
vous pouvez en fait servir des fichiers statiques dans une application de production Django, en toute sécurité et sans DEBUG=True
.
plutôt que D'utiliser Django lui-même, utilisez dj_static dans votre fichier WSGI ( 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 réponse est grande, mais ne fonctionne toujours pas pour moi, juste par l'ajout de ces lignes y sont décrits. Sur la base de cette réponse, les étapes qui ont réellement fonctionné pour moi où:
-
Installer WhiteNoise comme le décrit:
pip install WhiteNoise
-
créez la variable
STATIC_ROOT
et ajoutez un blanc à votre variableMIDDLEWARE
danssettings.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
-
alors, modifiez votre fichier
wsgi.py
comme expliqué dans la réponse de Johnny:#wsgi.py from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application)
-
après cela, déployez vos modifications sur votre serveur (avec git ou ce que vous utilisez).
-
enfin, lancez l'option
collectstatic
à partir de votremanage.py
sur votre serveur. Cela copiera tous les fichiers de votre statique dossiers dans le répertoireSTATIC_ROOT
nous avons spécifié avant:$ python manage.py collectstatic
Vous allez maintenant voir un nouveau dossier nommé
staticfiles
qui contient ces éléments.
après avoir suivi ces étapes, vous pouvez maintenant exécuter votre serveur et serez en mesure de voir vos fichiers statiques en mode Production.
mise à jour: dans le cas où vous aviez la version < 4 le changelog indique qu'il n'est plus nécessaire de déclarer le WSGI_APPLICATION = 'projectName.wsgi.application'
sur votre fichier settings.py
.
ouvrez votre projet urls.py, puis trouver cette déclaration si.
if settings.DEBUG:
urlpatterns += patterns(
'django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
vous pouvez changer les paramètres.DEBUG sur True et ça marchera toujours. Mais si votre projet est quelque chose de sérieux, alors vous devriez penser à d'autres solutions mentionnées ci-dessus.
if True:
urlpatterns += patterns(
'django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Dans django 1.10, vous pouvez écrire:
urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]
vous pouvez corriger cela de plusieurs façons. Voici mon approche.
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')} ),
)
assurez-vous de lire les documents;)
https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true
In urls.py j'ai ajouté cette ligne:
from django.views.static import serve
ajouter ces deux urls dans urlpatterns:
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
et les fichiers statiques et médias étaient accessibles lorsque DEBUG=FALSE.
Espérons que cela aide :)
Support pour les arguments de vue de chaîne de caractères à url () est déprécié et sera supprimé dans Django 1.10
ma solution est juste une petite correction à la solution de Conrado ci-dessus.
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')} ),
)
bien que ce ne soit pas plus sûr, mais vous pouvez changer le code source. naviguer vers Python/2.7/site-packages/django/conf/urls/static.py
puis modifier comme suit:
if settings.DEBUG or (prefix and '://' in prefix):
donc si settings.debug==False
ça n'aura pas d'effet sur le code, aussi après avoir lancé python manage.py runserver --runserver
pour lancer des fichiers statiques.
NOTE : les informations ne doivent être utilisées que pour les essais