Django static files on heroku

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.


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}),
    )

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


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)