Je construis une application en utilisant Django comme cheval de bataille. Jusqu'ici, tout s'est bien déroulé - paramètres de base de données spécifiés, répertoires statiques configurés, urls, vues, etc. Mais des problèmes ont commencé à se faufiler au moment où je voulais rendre mes propres pages belles et personnalisées 404.html et 500.html.
J'ai lu la documentation sur la gestion personnalisée des erreurs et défini les configurations nécessaires dans UrlsConf, créé les vues correspondantes et ajouté 404.html et 500.html au répertoire de modèles de mon application (spécifié également dans le fichier settings.py).
Mais les docs disent you can actually view custom error views until Debug is Off
, alors je l’ai éteint pour tester mes données, et c’est à ce moment-là que les choses se déchaînent!
Non seulement je ne parviens pas à afficher le fichier 404.html personnalisé (en fait, il se charge, mais mes pages d'erreur contiennent chacune un message d'erreur graphique, comme une belle image), la source de la page d'erreur se charge, mais rien d'autre ne se charge! Pas même lié CSS ou Javascript!
Généralement, une fois que j'ai défini DEBUG = False
, toutes les vues se chargent, mais tout contenu lié (CSS, Javascript, Images, etc.) ne se charge pas! Que ce passe-t-il? Quelque chose manque-t-il concernant les fichiers statiques et le paramètre DEBUG
?
Lorsque le débogage est désactivé, Django ne gérera plus les fichiers statiques pour vous - votre serveur Web de production (Apache ou quelque chose d’autre) devrait s’occuper de cela.
Si vous devez toujours installer un serveur statique localement (par exemple, pour tester sans déboguer), vous pouvez exécuter devserver en mode non sécurisé:
manage.py runserver --insecure
Vous pouvez utiliser WhiteNoise pour gérer des fichiers statiques en production.
Installer:
pip install WhiteNoise
Et changez votre fichier wsgi.py en ceci:
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 à blog créatif sur le guidon .
MAIS, il n’est vraiment pas recommandé de servir des fichiers statiques de cette façon en production. Votre serveur Web de production (comme nginx) devrait s’occuper de cela.
Si vous utilisez la vue du service statique en développement, vous devez avoir DEBUG = True:
Attention
Cela ne fonctionnera que si DEBUG est True.
C'est parce que ce point de vue est extrêmement inefficace et probablement peu sûr. Ceci est uniquement destiné au développement local et ne doit jamais être utilisé dans la production.
Docs: servir des fichiers statiques dans developent
EDIT: Vous pouvez ajouter des URL uniquement pour tester vos modèles 404 et 500, utilisez simplement la vue générique direct_to_template dans vos URL.
from Django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
('^404testing/$', direct_to_template, {'template': '404.html'})
)
Dans urls.py j'ai ajouté cette ligne:
from Django.views.static import serve
ajoutez 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 multimédias étaient accessibles lorsque DEBUG = FALSE.
J'espère que ça aide :)
Vous pouvez réellement 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())
La réponse de Johnny est excellente, mais ne m'a toujours pas fonctionné en ajoutant simplement les lignes décrites ici. Sur la base de cette réponse, les étapes qui ont réellement fonctionné pour moi sont les suivantes:
Installez WhiteNoise comme décrit:
pip install WhiteNoise
Créez la variable STATIC_ROOT
et ajoutez WhiteNoise à votre variable MIDDLEWARE
dans 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
Ensuite, 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, exécutez l’option collectstatic
de votre manage.py
sur votre serveur. Cela copiera tous les fichiers de vos dossiers statiques dans le répertoire STATIC_ROOT
que nous avons spécifié auparavant:
$ python manage.py collectstatic
Vous verrez maintenant un nouveau dossier nommé staticfiles
qui contient de tels éléments.
Après avoir suivi ces étapes, vous pouvez maintenant exécuter votre serveur et pourrez voir vos fichiers statiques en mode Production.
Mise à jour: Si vous avez 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 simplement votre projet urls.py, puis recherchez cette instruction if.
if settings.DEBUG:
urlpatterns += patterns(
'Django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Vous pouvez modifier settings.DEBUG sur True et cela fonctionnera toujours. Mais si votre projet est sérieux, vous devriez réfléchir aux 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 ainsi:
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 déboguer cela de différentes manières. 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 la documentation;)
https://docs.djangoproject.com/fr/2.0/howto/static-files/#limiting-use-to-debug-true
Je viens d'avoir un problème similaire: ne pas charger de fichiers statiques sur heroku avec DEBUG = False.
Solution
Sur production.py
:
STATIC_ROOT = 'static'
Déployé et juste travaillé (j'utilise dj_static comme l'a expliqué Robin Winslow).
Bien que ce ne soit pas le plus sûr, vous pouvez toutefois modifier le code source. accédez à Python/2.7/site-packages/Django/conf/urls/static.py
Puis éditez comme suit:
if settings.DEBUG or (prefix and '://' in prefix):
Donc, si settings.debug==False
cela n’affectera pas le code, essayez également, après avoir exécuté python manage.py runserver --runserver
d’exécuter des fichiers statiques.
NOTE: les informations ne doivent être utilisées qu'à des fins de test
La prise en charge des arguments de vue chaîne pour url () est obsolète et sera supprimée 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')} ),
)
J'ai apporté les modifications suivantes à mon projet/urls.py et cela a fonctionné pour moi
Ajouter cette ligne: depuis Django.conf.urls import url
et ajoutez: url (r '^ media/(? P. *) $', serve, {'document_root': settings.MEDIA_ROOT,}), dans urlpatterns.