[Django]-Django Static files 404

163๐Ÿ‘

This is the working solution for static/media/template access in django for windows,

settings.py

STATIC_ROOT = ''

STATIC_URL = '/static/'

STATICFILES_DIRS = ('static',)
๐Ÿ‘คAmar Kamthe

90๐Ÿ‘

For me this turned out to be caused by setting debug to false in settings.py. A workaround is to pass the --insecure switch to runserver, but the real solution is to use a proper web server to serve the static files. See the answers to this question for more details.

๐Ÿ‘คArthur Tacca

26๐Ÿ‘

If you are running this on a web server are you copying the static files to a public accessible folder? For example:

# web accessible folder
STATIC_ROOT = '/home/your_name/www/mealmate/static/'

# URL prefix for static files.
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # location of your application, should not be public web accessible 
    '/home/your_name/website/mealmate/static',
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

Then you can use this post Django static Files and copy the static files to the public accessible folder using manage.py

# --link    Create a symbolic link to each file instead of copying.
# --noinput Do NOT prompt the user for input of any kind.
#
python manage.py collectstatic -link --noinput

Hope that helps!

๐Ÿ‘คeodgooch

17๐Ÿ‘

from comments above โ€“ run this

python manage.py findstatic --verbosity 2 css/styles.css

No matching file found for โ€˜css/styles.cssโ€™.

Looking in the following locations:
/Users/yourname/Documents/Workspace/test/staticfiles

I simply renamed my static folder to staticfiles and all was well. (Iโ€™m on osx + django 1.x)

use insecure mode may not hurt if youโ€™re on local dev box โ€“ otherwise you may still get 404 errors.

python manage.py runserver --insecure

UPDATE

actually digging into settings.py found the infringing line.

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)
๐Ÿ‘คjohndpope

14๐Ÿ‘

If you recently changed the debug to false in settings file. Follow this procedure.

Most of the time it is caused by debug setting to be false in settings.py. If you pass the โ€“insecure switch to runserver it should work. So if you do python manage.py runserver 0.0.0.0:8000 change it to python manage.py runserver 0.0.0.0:8000 --insecure instead.

It should work.

๐Ÿ‘คKunal Kumar

9๐Ÿ‘

I simply added the equivalent of

STATICFILES_DIRS = (
    '/absolute_path_to_project/mealmate/static',
)

to get this working. Of course, replace absolute_path_to_project with your actual path and, if necessary, add the drive letter.

๐Ÿ‘คSeth

8๐Ÿ‘

I was also stuck in the 404 problem until I realized that Apache had blocked the requests to the static dir. I used python manage.py collectstatic to copy all the static files to the static dir under my project root, i.e. /var/my/site/static. With

Alias /static /var/my/site/static
<Directory /var/my/site/static>
        Require all granted
</Directory>

in /etc/httpd/conf/httpd.conf, it works properly now.

If none of the answers above works, you may consider checking your server config.

๐Ÿ‘คDarwin

7๐Ÿ‘

If you are suffering from this error then first check that is the debug true or false and are you using โ€˜STATIC_ROOTโ€™ and โ€˜STATICFILES_DIRSโ€™ together

For my case I have used the followings in my settings.py:

import os #(You have to import os at first)
    
#(If the app is in production mode then False. By default True)

DEBUG = False 

#(If debug is false then add allowed hosts)

ALLOWED_HOSTS = ['*'] 

#(Built in)

STATIC_URL = '/static/' 

STATIC_ROOT = 'static' (You have to add it to the code)

STATICFILES_DIRS = [ os.path.join(BASE_DIR, '/static') ] (You have to add it to the code)
๐Ÿ‘คAbindent

6๐Ÿ‘

In my case, all I had to do was re-run the server:

python manage.py runserver
๐Ÿ‘คDavor Josipovic

5๐Ÿ‘

Iโ€™m assuming youโ€™re using Django1.3+ here.

First off, you need to define a few more settings:

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

STATICFILES_DIRS = [
    path.join(TOP_DIR, 'static'),
]

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

This should help you find that directory.

Also, you should always access your static files using STATIC URL:

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">
๐Ÿ‘คdrewman

5๐Ÿ‘

add below in setting.py

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
๐Ÿ‘คyasin lachini

4๐Ÿ‘

Make sure mealmate is in your INSTALLED_APPS

๐Ÿ‘คchrisortman

4๐Ÿ‘

in Django, you have one more option for your templates and it is linking statics like this.

this might solve your problem!

<script src="{% static 'myapp/bootstrap.min.js' %}"></script>
<link href="{% static 'myapp/bootstrap.css' %}" rel="stylesheet" type="text/css"/>

its better and easier to use

{% static โ€˜filenameโ€™ %}

for more information refer to , i refer you to https://docs.djangoproject.com/en/1.11/intro/tutorial06/

๐Ÿ‘คEbrahim Karimi

3๐Ÿ‘

in my case my static files are in resources/static directory and I set some settings like blow in settings.py file :

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, './resources/static/'),
)

and using it in my template like this:

% load static %}
    <link rel="stylesheet" type="text/css" href="{% static '/plugins/bootstrap/css/bootstrap.css' %}">

this way worked for me.

๐Ÿ‘คahmad-mohammadi

2๐Ÿ‘

change DEBUG variable to True in your settings.

the runserver method only looks for statics if debug is enabled, if not, it will look in the STATIC_ROOT url

๐Ÿ‘คWesley Benicio

1๐Ÿ‘

Insert the following lines into settings.py in the main folder of your project:

STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join('static'))

Then, in the html file insert:

{% load static %}

Finally, within settings.py, add django.contrib.staticfiles into INSTALLED_APPS = [...]

1๐Ÿ‘

On localhost, make sure to define DEBUG = True on settings.py

0๐Ÿ‘

I think you missed to put the app INSTALLED_APPS in your settings.py file, you should add โ€œmealmateโ€

INSTALLED_APPS = (
    'mealmate',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

After that the static and command files will be visible to django. I was having trouble with commands and this is the way I fixed it.

๐Ÿ‘คOmar Alvarado

0๐Ÿ‘

on Cpanel this is good solution here

on terminal on cpanel install dj-static static3

pip install dj-static static3

then in wsgi.py replace this code py application

from dj_static import Cling

application = Cling(get_wsgi_application())

0๐Ÿ‘

I faced same issue. Here how I solve of accessing static file in template.

My Django project(Recognition/) file directory look like this:

/media
   /1
     i1.jpg
     i2.jpg
     ....

/static
    /css
       /op.css
    /img
       /emoji.png

/Recognition
    ...
    /settings.py
    /urls.py
    ...

/uploader
    ...
    /urls.py
    /templates
         /uploader
             /create.html
    ...

My settings.py look like this:

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

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Recognition',
    'uploader',
]

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

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

My (Recognition/urls.py) look like this:

urlpatterns = [
    path('admin/', admin.site.urls),
    ...
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Then I am accessing all static files and media files in template(create.html) like this:
Here is sample code

<!DOCTYPE html>
<html>
<head>
   {% block extrahead %}
      <link rel="stylesheet" type="text/css" href="static/css/op.css">
   {% endblock %}
</head>

<style type="text/css">
.notfound .notfound-404 {
  ...
  background-image: url('static/img/emoji.png');
  ...
}
<style>

<body>
  <img src="{{ MEDIA_ROOT }}/media/i1.jpg" class="image_responsive" height="100px" width="100px">
</body>

OR

You can use this django command to see where django is seeing your static files. SOURCE

python manage.py collectstatic --help
๐Ÿ‘คHarshit Mahajan

0๐Ÿ‘

for me, i do nothing but run manage.py runserver myip:port. Then i shut it down and restart uwsgi, the static files load successfully. I donโ€™t know why but it works for meโ€ฆ

๐Ÿ‘คli vector

0๐Ÿ‘

I was able to solve this same problem by changing the js filename from camel case to snake case.

๐Ÿ‘คRyan w

0๐Ÿ‘

In django version 4.1.2 STATIC_ROOT is not working instead use STATICFILES_DIRS = [ BASE_DIR / "static" ]

๐Ÿ‘คDiwakar Gupta

0๐Ÿ‘

as Django docs say; adding this code simple fixed my problem.

STATICFILES_DIRS = [
    BASE_DIR / "static",
]
๐Ÿ‘คEdris Ranjbar

0๐Ÿ‘

I use the standard gitignore file found here for every project. It excludes various folder names. One of the libraries I was using just happen to name the folder after one in the gitignore file. Took me a while to figure that one out!

๐Ÿ‘คjoshlsullivan

0๐Ÿ‘

Seems like youโ€™re loading static files the wrong way in your template. The correct way to do it is,

For Django 1.6 or earlier

{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static "css/bootstrap.min.css" %}">

For Django 1.7 to 2.1

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static "css/bootstrap.min.css" %}">

For Django 2.2 or later

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap.min.css' %}">

EDIT:

If you specify the URL of your static files differently in settings, itโ€™ll work differently for different values of DEBUG. Here are two ways. (Tested on Djago 4.1)

1. This configuration will load static files when DEBUG=True

STATIC_URL = 'static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

2. This configuration will load static files when DEBUG=False

STATIC_ROOT = BASE_DIR / 'static'

STATIC_URL = 'static/'

NOTE: Assuming your static files are present in the static folder in your projectโ€™s root directory. Please hard refresh the browser window while testing. (For chrome hold ctrl while clicking refresh wheel)

๐Ÿ‘คHarsh Dobariya

0๐Ÿ‘

For nowadays solution please try Django package Whitenoise. It is easy to install and easy to use if you followed the instructions.

some simplified steps:

  1. Collect static โ€“ make sure static files existing before install

     python manage.py collectstatic
    
  2. Install the Whitenoise โ€“ this step depends how you managed the packages, update proper file(e.g. Pipfile or requirements.txt) and install. Below command just a example to install the package.

     pip install whitenoise
    
  3. Update the static root in settings.py

     STATIC_ROOT = BASE_DIR / "staticfiles"
    
  4. Add the following to your MIDDLEWARE in settings.py โ€“ from Whwitenoise docs, Whitenoise package should place after django.middleware.security.SecurityMiddleware

     `MIDDLEWARE = [
       'django.middleware.security.SecurityMiddleware',
       'whitenoise.middleware.WhiteNoiseMiddleware', #add it here exactly after security middleware
       ...
     ]
    
  5. now restart or rebuild the app to check whether it is working for you.

Please check Whitenoise docs if you running into issue about installing the Whitenoise(Whitenoise docs)

a message for using staticfiles_urlpatterns:
this only works when DEBUG=True in settings.py which means you should NOT use it for production environment. see reference here

๐Ÿ‘คWei Jing

0๐Ÿ‘

in my case that was the problem:
root dir was project_name but app dir where static folder is was my_app, so django tried to find static files in project_name/static, when it was in
project_name/my_app/static, so I updated STATICFILES_DIRS = (โ€˜my_app/static/โ€™,)

i also added after defining STATICFILES_DIRS in settings.py:

print('static paths are:')
for p in STATICFILES_DIRS:
    print(Path(p).resolve())

to find out which was the right place, so i could get this command output when run this command:

python manage.py findstatic --verbosity 3 css/main.css
๐Ÿ‘คargentum4k

Leave a comment