Perché DEBUG = False setting fallisce nel mio django Static Files Access?

Sto costruendo un’app usando Django come mio cavallo di battaglia. Tutto è stato ben fatto – specifiche impostazioni db, directory statiche configurate, url, viste ecc. Ma i problemi iniziarono a intrufolarsi nel momento in cui volevo rendere le mie pagine belle e personalizzate 404.html e 500.html.

Ho letto i documenti sulla gestione degli errori personalizzati, ho impostato le configurazioni necessarie in UrlsConf, ho creato visualizzazioni corrispondenti e aggiunto il 404.html e il 500.html alla directory del modello della mia app (specificata anche in settings.py).

Ma i documenti dicono you can actually view custom error views until Debug is Off , quindi l’ho distriggersto per testare le mie cose, e questo è il momento in cui la roba impazzisce!

Non solo non riesco a visualizzare la 404.html personalizzata (in realtà, carica, ma poiché le mie pagine di errore contengono ciascuna un messaggio di errore grafico – come qualche bella immagine), l’origine della pagina di errore viene caricata, ma non carica nient’altro! Neanche collegato CSS o Javascript!

Generalmente, una volta impostato DEBUG = False , tutte le viste verranno caricate, ma qualsiasi contenuto collegato (CSS, Javascript, Immagini, ecc.) Non verrà caricato! Cosa sta succedendo? C’è qualcosa che mi manca, riguardo i file statici e l’impostazione DEBUG ?

    Con il debug distriggersto Django non gestirà più i file statici – il tuo server di produzione (Apache o qualcosa del genere) dovrebbe occuparsene.

    Se hai ancora bisogno di server statici localmente (ad es. Per test senza debug) puoi eseguire devserver in modalità non sicura:

     manage.py runserver --insecure 

    Puoi utilizzare WhiteNoise per pubblicare file statici in produzione.

    Installare:

     pip install WhiteNoise 

    E cambia il tuo file wsgi.py con questo:

     from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application) 

    E tu sei bello andare!

    Credito al blog creativo sul manubrio .

    MA, in realtà non è consigliabile servire file statici in questo modo durante la produzione. Il tuo server web di produzione (come nginx) dovrebbe occuparsene.

    Se stai usando la visualizzazione statica di servizio in fase di sviluppo, devi avere DEBUG = True:

    avvertimento

    Funzionerà solo se DEBUG è True.

    Questo perché questa visione è grossolanamente inefficiente e probabilmente insicura. Questo è inteso solo per lo sviluppo locale e non dovrebbe mai essere utilizzato in produzione.

    Documenti: serve file statici in sviluppo

    EDIT: potresti aggiungere alcuni URL solo per testare i tuoi modelli 404 e 500, basta usare la vista generica direct_to_template negli url.

     from django.views.generic.simple import direct_to_template urlpatterns = patterns('', ('^404testing/$', direct_to_template, {'template': '404.html'}) ) 

    In realtà puoi servire file statici in un’app di Django di produzione, in modo sicuro e senza DEBUG=True .

    Piuttosto che usare Django stesso, usa dj_static nel tuo file 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 risposta di Johnny è ottima, ma ancora non ha funzionato per me semplicemente aggiungendo le righe qui descritte. Sulla base di quella risposta, i passaggi che in realtà hanno funzionato per me dove:

    1. Installa WhiteNoise come descritto:

       pip install WhiteNoise 
    2. Crea la variabile STATIC_ROOT e aggiungi WhiteNoise alla tua variabile MIDDLEWARE in 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. Quindi, modifica il tuo file wsgi.py come spiegato nella risposta di Johnny:

       #wsgi.py from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application) 
    4. Successivamente, distribuisci le modifiche al tuo server (con git o qualsiasi altra cosa tu usi).

    5. Infine, esegui l’opzione manage.py dal tuo manage.py sul tuo server. Questo copierà tutti i file dalle tue cartelle statiche nella directory STATIC_ROOT abbiamo specificato prima:

       $ python manage.py collectstatic 

      Verrà ora visualizzata una nuova cartella denominata staticfiles che contiene tali elementi.

    Dopo aver seguito questi passaggi, ora puoi eseguire il tuo server e potrai vedere i tuoi file statici mentre sei in modalità Produzione.

    Aggiornamento: nel caso in cui avessi la versione <4 il WSGI_APPLICATION = ‘projectName.wsgi.application’ delle WSGI_APPLICATION = 'projectName.wsgi.application' indica che non è più necessario dichiarare WSGI_APPLICATION = 'projectName.wsgi.application' .

    Apri il tuo progetto urls.py, quindi trova questa istruzione if.

     if settings.DEBUG: urlpatterns += patterns( 'django.views.static', (r'^media/(?P.*)','serve',{'document_root': settings.MEDIA_ROOT}), ) 

    È ansible modificare le impostazioni.DEBUG su True e funzionerà sempre. Ma se il tuo progetto è qualcosa di serio, dovresti pensare ad altre soluzioni sopra menzionate.

     if True: urlpatterns += patterns( 'django.views.static', (r'^media/(?P.*)','serve',{'document_root': settings.MEDIA_ROOT}), ) 

    In django 1.10 puoi scrivere così:

     urlpatterns += [ url(r'^media/(?P.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ] 

    Puoi eseguire il debug in molti modi diversi. Ecco il mio approccio.

    localsettings.py:

     DEBUG = False DEBUG404 = True 

    urls.py:

     from django.conf import settings import os if settings.DEBUG404: urlpatterns += patterns('', (r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ), ) 

    Assicurati di leggere i documenti;)

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

    In urls.py ho aggiunto questa riga:

     from django.views.static import serve 

    aggiungi questi due url in urlpatterns:

     url(r'^media/(?P.*)$', serve,{'document_root': settings.MEDIA_ROOT}), url(r'^static/(?P.*)$', serve,{'document_root': settings.STATIC_ROOT}), 

    e sia i file statici che quelli multimediali erano accessibili quando DEBUG = FALSE.
    Spero che sia d’aiuto 🙂

    Il supporto per gli argomenti vista stringa su url () è deprecato e verrà rimosso in Django 1.10

    La mia soluzione è solo una piccola correzione alla soluzione Conrado sopra.

     from django.conf import settings import os from django.views.static import serve as staticserve if settings.DEBUG404: urlpatterns += patterns('', (r'^static/(?P.*)$', staticserve, {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ), ) 

    Anche se non è più sicuro, ma puoi cambiare il codice sorgente. vai a Python/2.7/site-packages/django/conf/urls/static.py

    Quindi modifica come segue:

     if settings.DEBUG or (prefix and '://' in prefix): 

    Quindi, se settings.debug==False non avrà effetto sul codice, anche dopo aver eseguito provare python manage.py runserver --runserver per eseguire file statici.

    NOTA : le informazioni devono essere utilizzate solo a scopo di test