web-dev-qa-db-fra.com

Pourquoi le paramètre DEBUG = False fait-il échouer mon Django Static Files Access?

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?

307
nemesisfixx

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.

303
Marek Sapota

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
428

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.

28
Johnny Zhao

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'})
)
17
j_syk

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 :)

13
stathoula

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())
11
Robin Winslow

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:

  1. Installez WhiteNoise comme décrit:

    pip install WhiteNoise
    
  2. 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
    
  3. 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)
    
  4. Après cela, déployez vos modifications sur votre serveur (avec git ou ce que vous utilisez).

  5. 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.

11
DarkCygnus

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 }), ]
6
Sergey Luchko

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

5
Conrado

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

1
gabriel

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

0
Natuto

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

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.

0
Namrata Sharma