[Fixed]-Django static files on heroku

18👍

Eventually solved this using the below in my urls file – from this question: Heroku – Handling static files in Django app

from <app> import settings
urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
    )

9👍

I have been dealing with the same problem too. I tried not to use the solution recommended by David since it seems to be used only in development (and not production) (See: Heroku static files not loading, Django)

And here are the 2 things that I changed in my code.

(I’m using Django 1.7)

1) settings.py

I add these lines to the setting files

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR,  'templates'),
    # Add to this list all the locations containing your static files 
)

STATIC_ROOT: this tells Django where to (a) put the static files when you run “python manage.py collectstatic” and (b) find the static files when you run the application

TEMPLATE_DIRS: this tells Django where to look for your static files when it search for statics files when you run “python manage.py collectstatic”

2) wsgi.py

Originally my file was:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")

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

And I changed it to:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxxx.settings")

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

Read here for more information on whitenoise: https://devcenter.heroku.com/articles/django-assets#whitenoise


Also, remember to install whitenoise:
pip install whitenoise==2.0.6

Before deploying the project, run:
python manage.py collectstatic

This will create a folder indicated by STATIC_ROOT (declared in your settings.py), containing all your static files.

4👍

It seems that it’s because you’re using the staticfiles app without having set the STATIC_ROOT setting.

In comparison, my settings.py is something like:

# Static asset configuration
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, '../myapp/static')

You should set the STATICFILES_DIRS too (note that my conf for this var is probably not the same than yours)

Then, push your code and try again.
If it still doesn’t work, you can use this to debug :
https://devcenter.heroku.com/articles/django-assets#debugging

2👍

Since Django 1.3 you’ve been able to do the following

# only showing relevant imports
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = patterns(
    '',

    # your urls go here
)

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL,
                          document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

2👍

For Django 2.1.7, I did the following changes in order to work:

  1. Added whitenoise to requirements.txt in addition to gunicorn

  2. Project settings.py should have the following:

    A) static settings:

    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"), 
    ]
    

    B) Add whitenoise to middleware:

    MIDDLEWARE = [
       .....
       'whitenoise.middleware.WhiteNoiseMiddleware',
    ]
    

Finally commit and push your changes then deploy your app peacefully.

Leave a comment