440 votes

Pourquoi le paramètre DEBUG=False fait-il échouer mon accès aux fichiers statiques de django ?

Je construis une application en utilisant Django comme cheval de bataille. Tout s'est bien passé jusqu'à présent - j'ai spécifié les paramètres de la base de données, configuré les répertoires statiques, les urls, les vues, etc. Mais les problèmes ont commencé à se faufiler au moment où j'ai voulu rendre mes propres pages 404.html et 500.html, belles et personnalisées.

J'ai lu la documentation sur la gestion personnalisée des erreurs, et j'ai défini les configurations nécessaires dans UrlsConf, créé les vues correspondantes et ajouté les fichiers 404.html et 500.html au répertoire des modèles de mon application (spécifié dans le fichier settings.py également).

Mais les docs disent you can actually view custom error views until Debug is Off Je l'ai donc éteint pour tester mon matériel, et c'est là que les choses se sont emballées !

Non seulement je ne parviens pas à afficher le fichier 404.html personnalisé (en fait, il se charge, mais comme mes pages d'erreur contiennent toutes un message d'erreur graphique - sous la forme d'une belle image), mais la source de la page d'erreur se charge, mais rien d'autre ne se charge ! Pas même les CSS ou Javascript liés !

En général, une fois que j'ai mis DEBUG = False Si l'on utilise la méthode de l'affichage automatique, toutes les vues se chargeront, mais le contenu lié (CSS, Javascript, images, etc.) ne se chargera pas ! Que se passe-t-il ? Est-ce qu'il y a quelque chose qui m'échappe, concernant les fichiers statiques et le système de gestion de l'image ? DEBUG le réglage ?

0 votes

Comment se passe l'hébergement ? Une machine locale avec le serveur de test ?

0 votes

Machine locale avec serveur de test. Je veux essentiellement voir comment ma gestion personnalisée des erreurs fonctionnerait en simulant localement des scénarios tels que l'accès à des pages inexistantes et en provoquant des erreurs d'exécution - mais mon contenu statique ne se charge pas.

0 votes

Soit cela peut être fait au niveau du serveur comme ici, soit cela peut être géré au niveau de Django en ajoutant urlpattern. J'ai trouvé cette question ci-dessous pour le même problème. stackoverflow.com/questions/6405173/

550voto

Dmitry Shevchenko Points 11398

Si vous avez toujours besoin d'un serveur statique local (par exemple pour des tests sans débogage), vous pouvez exécuter devserver en mode non sécurisé :

manage.py runserver --insecure

0 votes

@astrocybernaute assurez-vous que l'application staticfiles est installée.

8 votes

Bien que ce drapeau fonctionne, il ne sert pas le contenu du dossier collectstatic.

0 votes

Brillant ! Brillant ! Brillant !

434voto

Marek Sapota Points 7439

Lorsque le débogage est désactivé, Django ne gère plus les fichiers statiques pour vous - votre serveur Web de production (Apache ou autre) devrait s'en charger.

4 votes

Cela répond à ma curiosité, maintenant cela a du sens, et je peux en effet m'en occuper avec Apache si besoin est. Je pensais que c'était un problème avec mes propres paramètres. Merci

6 votes

J'ai trouvé cette réponse très utile. Juste au cas où quelqu'un d'autre serait dans la même situation que moi (utilisation de Google App Engine pour l'application avec django nonrel) : n'oubliez pas de mettre à jour app.yaml.

3 votes

Handlers : - url : /static static_dir : static

20voto

j_syk Points 2380

Si vous utilisez la vue de service statique dans le développement, vous devez avoir DEBUG = True :

Avertissement

Cela ne fonctionnera que si DEBUG est vrai.

C'est parce que cette vue est grossièrement inefficace et probablement non sécurisée. Elle n'est destinée qu'aux utilisateurs locaux de développement local, et ne devrait jamais être utilisée en production.

Docs : servir les fichiers statiques dans developent

EDIT : Vous pouvez ajouter quelques 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'})
)

1 votes

Comment faire alors pour servir les fichiers statiques en production ? NVM, je viens de voir ça. Merci.

0 votes

Vous devez configurer votre serveur web pour héberger un répertoire spécifique. Le plus souvent, vous utilisez Apache ou Nginx. Les Docs Je m'y attarde un peu.

0 votes

Merci @j_syk, j'avais déjà essayé cette approche de visualisation des 404.html et 500.html via un autre mécanisme de non-erreur similaire à ce que tu suggères. Mais je voulais savoir s'il était totalement impossible de faire en sorte que mes pages s'affichent correctement comme elles le feraient en production, tout en continuant à fonctionner simplement sur mon serveur de test - la délégation de la gestion des fichiers statiques à Apache lorsque Debug est désactivé a réglé la question pour moi. Merci de votre contribution.

15voto

Robin Winslow Points 2827

Vous pouvez en fait servir des fichiers statiques dans une application Django de production, 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())

4 votes

J'ai depuis découvert blanchisseuse qui peut être plus complet.

6voto

Conrado Points 116

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')} ),
    )

N'oubliez pas de lire la documentation ;)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X