Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Static Files results in 404

Tags:

python

django

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
like image 203
felix001 Avatar asked Feb 10 '13 16:02

felix001


People also ask

Does Django serve static files?

django.contrib.staticfiles provides a convenience management command for gathering static files in a single directory so you can serve them easily. This will copy all files from your static folders into the STATIC_ROOT directory. Use a web server of your choice to serve the files.

What does {% load static %} do in Django?

The {% static %} template tag generates the absolute URL of static files. That's all you need to do for development. Reload http://localhost:8000/polls/ and you should see that the question links are green (Django style!) which means that your stylesheet was properly loaded.

Where are Django static files stored?

Files are searched by using the enabled finders . The default is to look in all locations defined in STATICFILES_DIRS and in the 'static' directory of apps specified by the INSTALLED_APPS setting.


2 Answers

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

like image 164
Henrik Andersson Avatar answered Oct 02 '22 02:10

Henrik Andersson


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.

like image 44
Alexey Avatar answered Oct 02 '22 01:10

Alexey