问题
I've seen several posts for this issue but didn't found my solution.
I'm trying to serve static files within my Django 1.3 development environment.
Here are my settings
...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
'/static/',
)
...
My urls.py
urlpatterns = patterns('',
...
url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root', settings.STATIC_ROOT}
),
...
);
My /home/glide/Documents/django/cbox/static/ directory is like
css
main.css
javascript
image
I get a 404 error when trying to access http://127.0.0.1:8000/static/css/main.css.
Do I have to specify patterns for css, javascript and images individually ?
回答1:
I confused STATIC_ROOT and STATICFILES_DIRS
Actually I was not really understanding the utility of STATIC_ROOT. I thought that it was the directory on which I have to put my common files. This directory is used for the production, this is the directory on which static files will be put (collected) by collectstatic.
STATICFILES_DIRS is the one that I need.
Since I'm in a development environment, the solution for me is to not use STATIC_ROOT (or to specify another path) and set my common files directory in STATICFILES_DIRS:
#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
os.path.join(SITE_ROOT, 'static/'),
)
Also don't forget to from django.conf import settings
回答2:
Serving static files can be achieved in several ways; here are my notes to self:
- add a
static/my_app/
directory tomy_app
(see the note about namespacing below) - define a new top level directory and add that to STATICFILES_DIRS in settings.py (note that
The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting
)
I prefer the first way, and a setup that's close to the way defined in the documentation, so in order to serve the file admin-custom.css
to override a couple of admin styles, I have a setup like so:
.
├── my_app/
│ ├── static/
│ │ └── my_app/
│ │ └── admin-custom.css
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── static/
├── templates/
│ └── admin/
│ └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
This is then used in the template like so:
# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}
{% block extrahead %}
<link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}
During development, if you use django.contrib.staticfiles [ed: installed by default], this will be done automatically by runserver when DEBUG is set to True [...]
https://docs.djangoproject.com/en/1.10/howto/static-files/
When deploying, I run collectstatic
and serve static files with nginx.
The docs which cleared up all the confusion for me:
STATIC_ROOT
The absolute path to the directory where collectstatic will collect static files for deployment.
...it is not a place to store your static files permanently. You should do that in directories that will be found by staticfiles’s finders, which by default, are 'static/' app sub-directories and any directories you include in STATICFILES_DIRS).
https://docs.djangoproject.com/en/1.10/ref/settings/#static-root
Static file namespacing
Now we might be able to get away with putting our static files directly in my_app/static/ (rather than creating another my_app subdirectory), but it would actually be a bad idea. Django will use the first static file it finds whose name matches, and if you had a static file with the same name in a different application, Django would be unable to distinguish between them. We need to be able to point Django at the right one, and the easiest way to ensure this is by namespacing them. That is, by putting those static files inside another directory named for the application itself.
https://docs.djangoproject.com/en/1.10/howto/static-files/
STATICFILES_DIRS
Your project will probably also have static assets that aren’t tied to a particular app. In addition to using a static/ directory inside your apps, you can define a list of directories (STATICFILES_DIRS) in your settings file where Django will also look for static files.
https://docs.djangoproject.com/en/1.10/howto/static-files/
回答3:
There could be only two things in settings.py
file those makes your static files serve.
1) STATIC_URL = '/static/'
2)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
and your static files should lie under static directory which is in same directory as project's settings file.
Even then if your static files are not loading then reason is , you might have kept
DEBUG = False
change it to True (strictly for development only). In production just change STATICFILES_DIRS
to whatever path where static files resides.
回答4:
If your static URL is correct but still:
Not found: /static/css/main.css
Perhaps your WSGI problem.
➡ Config WSGI serves both development env and production env
==========================project/project/wsgi.py==========================
import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
application = StaticFilesHandler(get_wsgi_application())
else:
application = get_wsgi_application()
回答5:
Another error can be not having your app listed in the INSTALLED_APPS
listing like:
INSTALLED_APPS = [
# ...
'your_app',
]
Without having it in, you can face problems like not detecting your static files, basically all the files involving your app. Even though it can be correct as suggested in the correct answer by using:
STATICFILES_DIRS = (adding/path/of/your/app)
Can be one of the errors and should be reviewed if getting this error.
回答6:
I found that I moved my DEBUG
setting in my local settings to be overwritten by a default False
value. Essentially look to make sure the DEBUG setting is actually false if you are developing with DEBUG
and runserver
.
回答7:
- You can remove the
STATIC_ROOT
line Or you can create another
static
folder in different directory. For suppose the directory is:project\static
Now update:STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'project/static/') ] STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Whatever you do the main point is STATICFILES_DIRS
and STATIC_ROOT
should not contain same directory.
I know it's been a long time but hope the new buddies can get help from it
回答8:
{'document_root', settings.STATIC_ROOT}
needs to be
{'document_root': settings.STATIC_ROOT}
or you'll get an error like
dictionary update sequence element #0 has length 6; 2 is required
来源:https://stackoverflow.com/questions/6014663/django-static-file-not-found