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 ?

251
demandé sur nemesisfixx 2011-04-29 23:46:17

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.

262
répondu Marek Sapota 2011-04-29 19:53:49

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
379
répondu Dmitry Shevchenko 2011-10-03 19:55:15

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.

22
répondu Johnny Zhao 2018-03-19 09:49:03

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'})
)
14
répondu j_syk 2011-04-29 19:58:19

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())
10
répondu Robin Winslow 2014-09-14 10:00:06

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

  1. Installer WhiteNoise comme le décrit:

    pip install WhiteNoise
    
  2. créez la variable STATIC_ROOT et ajoutez un blanc à 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. 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)
    
  4. après cela, déployez vos modifications sur votre serveur (avec git ou ce que vous utilisez).

  5. enfin, lancez l'option collectstatic à partir de votre manage.py sur votre serveur. Cela copiera tous les fichiers de votre statique dossiers dans le répertoire STATIC_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 .

7
répondu DarkCygnus 2018-10-03 00:07:57

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 }), ]
5
répondu Sergey Luchko 2016-08-05 07:16:46

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

4
répondu Conrado 2018-01-27 13:29:13

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

3
répondu stathoula 2018-04-08 20:59:29

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')} ),
        )
0
répondu be_good_do_good 2016-01-20 10:50:42

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

0
répondu Natuto 2016-10-29 18:31:40