2016-02-19 17 views
7

Questa domanda sembra essere richiesta più volte ma non riesco a risolverlo.Impossibile trovare file statici di Django su Heroku (con whitenoise)

Ho distribuito un'applicazione django in produzione con DEBUG = False. Ho impostato il mio allowed_host. Ho usato {% load static from staticfiles %} per caricare file statici. Io scrivo esattamente le impostazioni sugested da Heroku doc:

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) 

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles') 
STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'), 
) 

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 

ma ho ottenuto un errore 500. E ottenuto questo traceback (per posta)

... 
`cache_name = self.clean_name(self.hashed_name(name)) 
File "/app/.heroku/python/lib/python3.5/site- packages/django/contrib/staticfiles/storage.py", line 94, in hashed_name (clean_name, self)) 
... 
ValueError: The file ‘app/css/font.css’ could not be found with <whitenoise.django.GzipManifestStaticFilesStorage object at 0x7febf600a7f0>.` 

Quando eseguo heroku run python manage.py collectstatic --noinput Tutto sembra ok:

276 static files copied to '/app/annuaire/staticfiles', 276 post-processed.

Qualcuno ha un'idea per aiutarmi, per favore?

Grazie

EDIT:

annuaire 
|-- /annuaire 
|-- -- /settings.py 
|-- /app 
|-- -- /static/...` 

wsgi.py

from django.core.wsgi import get_wsgi_application 
from whitenoise.django import DjangoWhiteNoise 


application = get_wsgi_application() 
application = DjangoWhiteNoise(application) 
+1

Django solo di solito chiama quella particolare funzione quando DEBUG = False quindi sono perplesso che si potrebbe ottenere quell'errore con DEBUG = true. Suggerirei di testare la tua app localmente con DEBUG = False, eseguendo 'collectstatic' e quindi' runserver' e vediamo se ottieni questo errore. Potrebbe essere che non hai commesso quel particolare file? –

+0

Siamo spiacenti! Quando Debug è Falso, hai ragione! – vpoulain

+0

Hai stampato 'STATIC_ROOT' per assicurarti che sia lo stesso di"/app/annuaire/staticfiles "? – agconti

risposta

1

per BASE_DIR è necessario un doppio dirname se le impostazioni non sono nella radice, ma in// cartella projectname :

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'), 
) 
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 
# for /static/root/favicon.ico  
WHITENOISE_ROOT = os.path.join(BASE_DIR, 'staticfiles', 'root') 

template.html

{% load staticfiles %} 
<link rel="stylesheet" href="{% static "app/css/font.css" %}"> 

albero app per questo esempio:

annuaire 
|-- /annuaire 
|-- -- /settings.py 
|-- /app 
|-- /static/app/css/font.css 
+0

Grazie! L'ho fatto ma non funziona ancora ... Ho modificato il mio albero app django nel post principale della domanda. – vpoulain

+0

E 'strano quando ho collecttatic Ho ottenuto 275 file statici copiati in "/ app/staticfiles", 1 non modificato, 276 post-elaborati. Ma su heroku bash: staticfiles è ancora vuoto ... – vpoulain

+0

@vpoulain Questo perché ogni nuovo Il processo di Heroku viene eseguito nel proprio filesystem effimero, quindi i nuovi file non saranno visti da nessun altro processo. (Vedi https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem). 'collectstatic' deve essere eseguito durante il push iniziale per la permanenza dei file. –

4

ho capito. Avevo bisogno di aggiungere python manage.py collectstatic --noinput; nel mio Procfile. Il documento di Heroku ha detto che collecticstatic viene attivato automaticamente. https://devcenter.heroku.com/articles/django-assets

Grazie

+0

o semplicemente rimuovi la variabile ambientale 'DISABLE_COLLECTSTATIC' dalle impostazioni della tua app attraverso la [dashboard] (https://id.heroku.com/login). Quello che è importante è questo: NON ruotare il suo valore a 0, basta eliminare completamente questa variabile env. In questo modo non dovresti modificare il tuo 'Procfile'. Quindi, tutti dovrebbero funzionare (almeno hanno funzionato per me!). I crediti vanno a: [YunoJuno] (http://tech.yunojuno.com/django-whitenoise-and-heroku-s-ephemeral-filesystem). –

1

Con DEBUG=False, ciò che gli originali utilizzano per lavoro non funziona più per me.

Tuttavia una soluzione abilitando whitenoise su MIDDLEWARE in settings.py risolto. Meglio essere appena sotto SecurityMiddleware.

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'whitenoise.middleware.WhiteNoiseMiddleware', # add this line 
    #Other middleware... 
] 

`` `

Secondo il docs, ha bisogno in realtà essere attivato in primo luogo.

0

Il problema è che l'applicazione Python in Heroku utilizza il server Web incorporato e non serve file statici.

È possibile utilizzare l'app dello whitenoise, questa soluzione di lavoro è al 100%.

Supponiamo di avere già generato file statici, ad esempio:

$ python manage.py collectstatic 

Dopodiché è necessario fare questo:

1) $ pip install whitenoise

2) aggiungere stringa "Whitenoise == 3.3. 0 "nel proprio requirements.txt

3) aggiungere il codice nelle impostazioni . py

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 

4) aggiungere questo codice nel app/wsgi.py

from whitenoise.django import DjangoWhiteNoise 
application = DjangoWhiteNoise(application) 
0

Oltre a risposte di cui sopra, può anche essere che non è stato specificato un corretto STATIC_ROOT come descritto in https://docs.djangoproject.com/en/2.0/howto/static-files/#deployment

Per me, la soluzione è stata aggiunta alla fine delle impostazioni di produzione.py

STATIC_ROOT = "/app/static/" 

sapere dove la cartella statica è nella vostra Heroku eseguire questo

heroku run python manage.py collectstatic 

Poi si vedrà il percorso ci viene mostrato.

0

Per il mio lavoro successivo.

settings.py

DEBUG = True 

STATIC_URL = '/static/' 
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') #this is not used 
# Add static folder to STATIC_DIRS 
STATICFILES_DIRS = [ 
    os.path.join(BASE_DIR, 'static'), 
] 

urls.py

from django.conf.urls.static import static 
from django.conf import settings 

urlpatterns = [ 

] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 

Note

This helper function works only in debug mode and only if the given prefix is local (e.g. /static/) and not a URL (e.g. http://static.example.com/).

Also this helper function only serves the actual STATIC_ROOT folder; it doesn’t perform static files discovery like django.contrib.staticfiles.