Django: Not Found static/admin/css

31,334

Solution 1

You shouldn't change BASE_DIR

In settings.py edit the value of STATIC_ROOT

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

And run collectstatic again

Solution 2

You also need to add the static directory to your urls.py file. Add the following:

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

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

Solution 3

I had the same problem and neither of the answers didn't work for me. In this way, I found this solution to deal with that:

I used STATICFILES_DIRS instead of STATIC_ROOT and also debug should be turned true:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
DEBUG = True

If you are using a subfolder (i.e. front-end) for your static files you could use the following procedure:

from unipath import Path

BASE_DIR = Path(__file__).ancestor(2)
# STATIC_ROOT = os.path.join(BASE_DIR.child('front-end'), "static")
STATICFILES_DIRS = [
    os.path.join(BASE_DIR.child('front-end'), "static"),
]
DEBUG = True

[NOTE]:

  • Django 2.2
  • Python 3.6

Solution 4

Django does not serve static files in production. Normally, To serve Django static files in production you need to setup a standalone server e.g. nginx.

However, the way to serve static files in Heroku is a little different. See the link below, provided by Heroku team, for details on how to serve static files in Heroku:
https://devcenter.heroku.com/articles/django-assets

EDIT: making the answer conform to stackoverflow guidelines:

as per the Heroku guidelines to serve static files:

add in settings.py:

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

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'

# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'),
)

then install WhiteNoise project with the following command:

$ pip install whitenoise

and in your wsgi.py:

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

    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
Share:
31,334

Related videos on Youtube

Admin
Author by

Admin

Updated on July 18, 2021

Comments

  • Admin
    Admin almost 3 years

    I just deployed my first Django app on Heroku but I notice that it doesn't have any CSS like when I runserver on the local machine. I know there's something wrong with static files but I don't understand much about it even when I already read the docs. I can do

    python3 manage.py collectstatic

    to create a static folder but I don't know where to put it and how to change the DIRS in settings.py. I really need some help to get rid of it.

    root directory

    settings.py:

    DEBUG = True
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'household_management',
    ]
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    STATIC_ROOT = 'static'
    STATIC_URL = '/static/'
    

    heroku logs:

    2016-09-02T10:42:09.461124+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-earth-63194.herokuapp.com request_id=33fc071d-344c-47e7-8721-919ba6d5df65 fwd="14.191.217.103" dyno=web.1 connect=2ms service=53ms status=302 bytes=400
    2016-09-02T10:42:09.760323+00:00 heroku[router]: at=info method=GET path="/admin/login/?next=/" host=peaceful-earth-63194.herokuapp.com request_id=c050edcd-02d9-4c39-88ba-8a16be692843 fwd="14.191.217.103" dyno=web.1 connect=1ms service=45ms status=200 bytes=2184
    2016-09-02T10:42:10.037370+00:00 heroku[router]: at=info method=GET path="/static/admin/css/login.css" host=peaceful-earth-63194.herokuapp.com request_id=ec43016a-09b7-499f-a84b-b8024577b717 fwd="14.191.217.103" dyno=web.1 connect=2ms service=9ms status=404 bytes=4569
    2016-09-02T10:42:10.047224+00:00 heroku[router]: at=info method=GET path="/static/admin/css/base.css" host=peaceful-earth-63194.herokuapp.com request_id=6570ee02-3b78-44f4-9ab9-0e80b706ea40 fwd="14.191.217.103" dyno=web.1 connect=1ms service=16ms status=404 bytes=4566
    2016-09-02T10:42:10.030726+00:00 app[web.1]: Not Found: /static/admin/css/login.css
    2016-09-02T10:42:10.043743+00:00 app[web.1]: Not Found: /static/admin/css/base.css
    2016-09-02T10:48:56.593180+00:00 heroku[api]: Deploy d1d39dc by [email protected]
    2016-09-02T10:48:56.593290+00:00 heroku[api]: Release v21 created by [email protected]
    2016-09-02T10:48:56.803122+00:00 heroku[slug-compiler]: Slug compilation started
    2016-09-02T10:48:56.803127+00:00 heroku[slug-compiler]: Slug compilation finished
    2016-09-02T10:48:56.893962+00:00 heroku[web.1]: Restarting
    2016-09-02T10:48:56.894722+00:00 heroku[web.1]: State changed from up to starting
    2016-09-02T10:48:59.681267+00:00 heroku[web.1]: Stopping all processes with SIGTERM
    2016-09-02T10:49:00.418357+00:00 app[web.1]: [2016-09-02 17:49:00 +0000] [9] [INFO] Worker exiting (pid: 9)
    2016-09-02T10:49:00.418377+00:00 app[web.1]: [2016-09-02 17:49:00 +0000] [10] [INFO] Worker exiting (pid: 10)
    2016-09-02T10:49:00.418393+00:00 app[web.1]: [2016-09-02 10:49:00 +0000] [3] [INFO] Handling signal: term
    2016-09-02T10:49:00.477684+00:00 app[web.1]: [2016-09-02 10:49:00 +0000] [3] [INFO] Shutting down: Master
    2016-09-02T10:49:00.594623+00:00 heroku[web.1]: Process exited with status 0
    2016-09-02T10:49:00.607775+00:00 heroku[web.1]: Starting process with command `gunicorn assignment.wsgi --log-file -`
    2016-09-02T10:49:02.911936+00:00 app[web.1]: [2016-09-02 10:49:02 +0000] [3] [INFO] Starting gunicorn 19.6.0
    2016-09-02T10:49:02.912529+00:00 app[web.1]: [2016-09-02 10:49:02 +0000] [3] [INFO] Listening at: http://0.0.0.0:18162 (3)
    2016-09-02T10:49:02.917427+00:00 app[web.1]: [2016-09-02 10:49:02 +0000] [9] [INFO] Booting worker with pid: 9
    2016-09-02T10:49:02.912655+00:00 app[web.1]: [2016-09-02 10:49:02 +0000] [3] [INFO] Using worker: sync
    2016-09-02T10:49:02.980208+00:00 app[web.1]: [2016-09-02 10:49:02 +0000] [10] [INFO] Booting worker with pid: 10
    2016-09-02T10:49:04.228057+00:00 heroku[web.1]: State changed from starting to up
    2016-09-02T10:53:41.572630+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-earth-63194.herokuapp.com request_id=68c0b216-2084-46c8-9be5-b7e5aacaa590 fwd="14.191.217.103" dyno=web.1 connect=0ms service=42ms status=302 bytes=400
    2016-09-02T10:53:41.880217+00:00 heroku[router]: at=info method=GET path="/admin/login/?next=/" host=peaceful-earth-63194.herokuapp.com request_id=17b91dc2-ba06-482c-8af0-e7b015fe2077 fwd="14.191.217.103" dyno=web.1 connect=0ms service=41ms status=200 bytes=2184
    2016-09-02T10:53:42.156295+00:00 heroku[router]: at=info method=GET path="/static/admin/css/base.css" host=peaceful-earth-63194.herokuapp.com request_id=40dec62d-8c4a-4af6-8e0f-8053fe8379b9 fwd="14.191.217.103" dyno=web.1 connect=0ms service=9ms status=404 bytes=4566
    2016-09-02T10:53:42.157491+00:00 heroku[router]: at=info method=GET path="/static/admin/css/login.css" host=peaceful-earth-63194.herokuapp.com request_id=3a29f200-c185-4344-a6e1-5af35e5d120e fwd="14.191.217.103" dyno=web.1 connect=0ms service=17ms status=404 bytes=4569
    2016-09-02T10:53:42.164162+00:00 app[web.1]: Not Found: /static/admin/css/base.css
    2016-09-02T10:53:42.177480+00:00 app[web.1]: Not Found: /static/admin/css/login.css
    2016-09-02T11:01:19.031353+00:00 heroku[api]: Deploy 2beb15a by [email protected]
    2016-09-02T11:01:19.031444+00:00 heroku[api]: Release v22 created by [email protected]
    2016-09-02T11:01:19.262522+00:00 heroku[slug-compiler]: Slug compilation started
    2016-09-02T11:01:19.262528+00:00 heroku[slug-compiler]: Slug compilation finished
    2016-09-02T11:01:19.426837+00:00 heroku[web.1]: Restarting
    2016-09-02T11:01:19.427455+00:00 heroku[web.1]: State changed from up to starting
    2016-09-02T11:01:22.141325+00:00 heroku[web.1]: Stopping all processes with SIGTERM
    2016-09-02T11:01:22.545379+00:00 heroku[web.1]: Starting process with command `gunicorn assignment.wsgi --log-file -`
    2016-09-02T11:01:22.754067+00:00 app[web.1]: [2016-09-02 18:01:22 +0000] [9] [INFO] Worker exiting (pid: 9)
    2016-09-02T11:01:22.754077+00:00 app[web.1]: [2016-09-02 18:01:22 +0000] [10] [INFO] Worker exiting (pid: 10)
    2016-09-02T11:01:22.757599+00:00 app[web.1]: [2016-09-02 11:01:22 +0000] [3] [INFO] Handling signal: term
    2016-09-02T11:01:22.763197+00:00 app[web.1]: [2016-09-02 11:01:22 +0000] [3] [INFO] Shutting down: Master
    2016-09-02T11:01:22.880977+00:00 heroku[web.1]: Process exited with status 0
    2016-09-02T11:01:24.628348+00:00 app[web.1]: [2016-09-02 11:01:24 +0000] [3] [INFO] Starting gunicorn 19.6.0
    2016-09-02T11:01:24.628921+00:00 app[web.1]: [2016-09-02 11:01:24 +0000] [3] [INFO] Listening at: http://0.0.0.0:34235 (3)
    2016-09-02T11:01:24.629075+00:00 app[web.1]: [2016-09-02 11:01:24 +0000] [3] [INFO] Using worker: sync
    2016-09-02T11:01:24.636198+00:00 app[web.1]: [2016-09-02 11:01:24 +0000] [9] [INFO] Booting worker with pid: 9
    2016-09-02T11:01:24.722355+00:00 app[web.1]: [2016-09-02 11:01:24 +0000] [10] [INFO] Booting worker with pid: 10
    2016-09-02T11:01:26.271435+00:00 heroku[web.1]: State changed from starting to up
    2016-09-02T11:01:27.930795+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-earth-63194.herokuapp.com request_id=a844ef4b-a2d1-44fe-af0e-09c76cb0e034 fwd="14.191.217.103" dyno=web.1 connect=0ms service=46ms status=302 bytes=400
    2016-09-02T11:01:28.363163+00:00 heroku[router]: at=info method=GET path="/admin/login/?next=/" host=peaceful-earth-63194.herokuapp.com request_id=31c0823a-466f-4363-b550-3c81681305f5 fwd="14.191.217.103" dyno=web.1 connect=0ms service=171ms status=200 bytes=2184
    2016-09-02T11:01:28.716801+00:00 heroku[router]: at=info method=GET path="/static/admin/css/base.css" host=peaceful-earth-63194.herokuapp.com request_id=2d1b8bb2-9ab3-49f7-b557-a54eed996547 fwd="14.191.217.103" dyno=web.1 connect=0ms service=8ms status=404 bytes=4566
    2016-09-02T11:01:28.693936+00:00 heroku[router]: at=info method=GET path="/static/admin/css/login.css" host=peaceful-earth-63194.herokuapp.com request_id=24aa1eed-aa87-4854-ab35-1604e8393b9d fwd="14.191.217.103" dyno=web.1 connect=0ms service=18ms status=404 bytes=4569
    2016-09-02T11:01:28.681948+00:00 app[web.1]: Not Found: /static/admin/css/base.css
    2016-09-02T11:01:28.692958+00:00 app[web.1]: Not Found: /static/admin/css/login.css
    2016-09-02T11:12:43.686922+00:00 heroku[api]: Deploy 63085e6 by [email protected]
    2016-09-02T11:12:43.687037+00:00 heroku[api]: Release v23 created by [email protected]
    2016-09-02T11:12:43.951987+00:00 heroku[slug-compiler]: Slug compilation started
    2016-09-02T11:12:43.951998+00:00 heroku[slug-compiler]: Slug compilation finished
    2016-09-02T11:12:43.926959+00:00 heroku[web.1]: Restarting
    2016-09-02T11:12:43.929107+00:00 heroku[web.1]: State changed from up to starting
    2016-09-02T11:12:46.931285+00:00 heroku[web.1]: Starting process with command `gunicorn assignment.wsgi --log-file -`
    2016-09-02T11:12:47.860591+00:00 heroku[web.1]: Stopping all processes with SIGTERM
    2016-09-02T11:12:48.729601+00:00 app[web.1]: [2016-09-02 18:12:48 +0000] [10] [INFO] Worker exiting (pid: 10)
    2016-09-02T11:12:48.729617+00:00 app[web.1]: [2016-09-02 18:12:48 +0000] [9] [INFO] Worker exiting (pid: 9)
    2016-09-02T11:12:48.729623+00:00 app[web.1]: [2016-09-02 11:12:48 +0000] [3] [INFO] Handling signal: term
    2016-09-02T11:12:48.775112+00:00 app[web.1]: [2016-09-02 11:12:48 +0000] [3] [INFO] Shutting down: Master
    2016-09-02T11:12:48.890301+00:00 heroku[web.1]: Process exited with status 0
    2016-09-02T11:12:48.839674+00:00 app[web.1]: [2016-09-02 11:12:48 +0000] [3] [INFO] Starting gunicorn 19.6.0
    2016-09-02T11:12:48.840093+00:00 app[web.1]: [2016-09-02 11:12:48 +0000] [3] [INFO] Listening at: http://0.0.0.0:20001 (3)
    2016-09-02T11:12:48.840166+00:00 app[web.1]: [2016-09-02 11:12:48 +0000] [3] [INFO] Using worker: sync
    2016-09-02T11:12:48.843687+00:00 app[web.1]: [2016-09-02 11:12:48 +0000] [9] [INFO] Booting worker with pid: 9
    2016-09-02T11:12:48.939210+00:00 app[web.1]: [2016-09-02 11:12:48 +0000] [10] [INFO] Booting worker with pid: 10
    2016-09-02T11:12:50.565750+00:00 heroku[web.1]: State changed from starting to up
    2016-09-02T11:13:00.439745+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-earth-63194.herokuapp.com request_id=c30b47e6-fbb8-4412-9242-5fe37217026a fwd="14.191.217.103" dyno=web.1 connect=0ms service=49ms status=400 bytes=199
    2016-09-02T11:14:01.686661+00:00 heroku[api]: Deploy c149525 by [email protected]
    2016-09-02T11:14:01.686965+00:00 heroku[api]: Release v24 created by [email protected]
    2016-09-02T11:14:02.189063+00:00 heroku[slug-compiler]: Slug compilation started
    2016-09-02T11:14:02.189073+00:00 heroku[slug-compiler]: Slug compilation finished
    2016-09-02T11:14:02.466456+00:00 heroku[web.1]: Restarting
    2016-09-02T11:14:02.467005+00:00 heroku[web.1]: State changed from up to starting
    2016-09-02T11:14:04.713176+00:00 heroku[web.1]: Stopping all processes with SIGTERM
    2016-09-02T11:14:05.259388+00:00 app[web.1]: [2016-09-02 18:14:05 +0000] [10] [INFO] Worker exiting (pid: 10)
    2016-09-02T11:14:05.260345+00:00 app[web.1]: [2016-09-02 11:14:05 +0000] [3] [INFO] Handling signal: term
    2016-09-02T11:14:05.265937+00:00 app[web.1]: [2016-09-02 18:14:05 +0000] [9] [INFO] Worker exiting (pid: 9)
    2016-09-02T11:14:05.317647+00:00 app[web.1]: [2016-09-02 11:14:05 +0000] [3] [INFO] Shutting down: Master
    2016-09-02T11:14:05.411311+00:00 heroku[web.1]: Process exited with status 0
    2016-09-02T11:14:06.581314+00:00 heroku[web.1]: Starting process with command `gunicorn assignment.wsgi --log-file -`
    2016-09-02T11:14:10.282506+00:00 heroku[web.1]: State changed from starting to up
    2016-09-02T11:14:10.187781+00:00 app[web.1]: [2016-09-02 11:14:10 +0000] [3] [INFO] Starting gunicorn 19.6.0
    2016-09-02T11:14:10.188490+00:00 app[web.1]: [2016-09-02 11:14:10 +0000] [3] [INFO] Listening at: http://0.0.0.0:27446 (3)
    2016-09-02T11:14:10.188627+00:00 app[web.1]: [2016-09-02 11:14:10 +0000] [3] [INFO] Using worker: sync
    2016-09-02T11:14:10.211822+00:00 app[web.1]: [2016-09-02 11:14:10 +0000] [9] [INFO] Booting worker with pid: 9
    2016-09-02T11:14:10.231978+00:00 app[web.1]: [2016-09-02 11:14:10 +0000] [10] [INFO] Booting worker with pid: 10
    2016-09-02T11:14:29.714607+00:00 heroku[router]: at=info method=GET path="/" host=peaceful-earth-63194.herokuapp.com request_id=947ed6b9-b48a-48b1-8860-36846248acea fwd="14.191.217.103" dyno=web.1 connect=0ms service=153ms status=302 bytes=400
    2016-09-02T11:14:30.522664+00:00 heroku[router]: at=info method=GET path="/admin/login/?next=/" host=peaceful-earth-63194.herokuapp.com request_id=b74c55bf-913c-4e0d-8d16-2b1f4f0cea13 fwd="14.191.217.103" dyno=web.1 connect=0ms service=561ms status=200 bytes=2184
    2016-09-02T11:14:30.879732+00:00 heroku[router]: at=info method=GET path="/static/admin/css/base.css" host=peaceful-earth-63194.herokuapp.com request_id=769f989a-f051-4a89-a079-1d6acea3c185 fwd="14.191.217.103" dyno=web.1 connect=0ms service=86ms status=404 bytes=4566
    2016-09-02T11:14:30.865971+00:00 heroku[router]: at=info method=GET path="/static/admin/css/login.css" host=peaceful-earth-63194.herokuapp.com request_id=b271b831-a4fb-4bdb-9f6a-e4d66297db88 fwd="14.191.217.103" dyno=web.1 connect=0ms service=75ms status=404 bytes=4569
    2016-09-02T11:14:30.865501+00:00 app[web.1]: Not Found: /static/admin/css/login.css
    2016-09-02T11:14:30.871110+00:00 app[web.1]: Not Found: /static/admin/css/base.css
    
  • Admin
    Admin over 7 years
    I ran collectstatic, now where should I put the static folder in?
  • 4140tm
    4140tm over 7 years
    You don't put it anywhere. If the command ran successfully you should have a folder called static at your project's root. It should contain your css and js and that's from where these files should be served. You might have to further configure the server or change your templates to serve statics. Check Heroku's docs on the subject as others have suggested
  • nico
    nico about 4 years
    I had a hard time getting this to work when running from docker. This blog post was extremely helpful for me: testdriven.io/blog/…
  • Benyamin Jafari - aGn
    Benyamin Jafari - aGn almost 4 years
    When I add static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) to urlpatterns I encounter with this error: (urls.E004) Your URL pattern [] is invalid. Ensure that urlpatterns is a list of path() and/or re_path() instances.
  • user1847
    user1847 almost 4 years
    @BenyaminJafari this means your urlpatterns list is empty. Check your syntax and take another stab at it. It appears you are not actually adding static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) to the list.
  • Benyamin Jafari - aGn
    Benyamin Jafari - aGn almost 4 years
    No, urlpatterns list is not empty and there isn't any problem in syntax. It means urlspattern only supports path() and re_path() not static(). Anyway, my problem was solved through another way.
  • user1847
    user1847 almost 4 years
    static() returns a re_path object :) Source: github.com/django/django/blob/master/django/conf/urls/static‌​.py