Django Static Files results in 404

Posted on

Question :

Django Static Files results in 404

Ive checked over quite a few of the other threads on being unable to serve static content using the static file app within Django but as yet have yet to find a solution.

settings.py

STATIC_ROOT = '/opt/django/webtools/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    "/home/html/static",
)
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

Template

relevant line….

<img src="{{ STATIC_URL }}macmonster/img/macmonster-logo-blue.png" >

Logs

From the logs it looks like the path is correct, but alas it is still resulting in a 404..

[10/Feb/2013 16:19:50] "GET /static/macmonster/img/macmonster-logo-blue.png HTTP/1.1" 404 1817
[10/Feb/2013 16:19:51] "GET /static/macmonster/img/macmonster-logo-blue.png HTTP/1.1" 404 1817
Asked By: felix001

||

Answer #1:

For local serving of static files, if you haven’t set up any form of collecting of staticfiles and if you’re running Django 1.3+, I believe this is the way your settings.py should look like when refering to static files

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
 '/Users/cupcake/Documents/Workspaces/myDjangoProject/someOtherFolderPerhapsIfYouWant/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',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

Notice that I’ve left out the STATIC_ROOT here.
This is because I don’t have the need for static files collection “just yet”.

The collecting of static files is to allieviate(spelling) the problems with serving multiple diffrent staticfiles folders, so they merged the staticfiles app that was used normally for helping with this problem.
What this does, and it’s described in the docs, is to take all the static files from all your apps and put them into one (1) folder for easier serving when putting your app into production.

So you’re problem is that you’ve “missed” this step and that’s why you’re getting a 404 when trying to access them.
Therefore you need to use a absolute path to your static files ie. on a mac or unix system it should look something like this:

'/Users/cupcake/Documents/Workspaces/myDjangoProject/someOtherFolderPerhapsIfYouWant/static',

Also, you could simplify and “fix” the need of having a hardcoded path like that which I used for illustration and do like this

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

STATICFILES_DIRS = (
    PROJECT_ROOT + '/static/'
)

This would fix the portability problem as well. A good Stackoverflow post about that is found here

I hope I made it a bit clearer, otherwise please correct me if I’m wrong ^_^!

For collecting and how to manage static files in the newer versions of Django read this link
The staticfiles app

Answered By: Henrik Andersson

Answer #2:

Change

STATIC_URL = '/static/'

set

STATIC_URL = 'http://yourdomain.com/static/'

it’s unbelievable but, after 1 hour searching it solution solve my problem with static files and remove STATIC_ROOT from STATICFILES_DIRS.
STATICFILES_DIRS is just for collecting all the static in modules and store it in STATIC_ROOT.

Answered By: Alexey

Leave a Reply

Your email address will not be published.