Reputation: 17266
In production, the apache server can handle serving static
files just fine. For testing on my local machine I'm using manage.py runserver
.
It seems the django apps I have somehow inject some default search paths into this debug server. The browser url shows everything under /static/whatever
, but those files are coming from all over the place. This is fine for testing but when moving to production I'll need them in the one path. Thankfully, manage.py collectstatic
provides a handy method to copy everything to the one directory given by STATIC_ROOT
in settings.py
. I've set mine to os.path.join(BASE_DIR, 'static/')
where BASE_DIR
is where manage.py
is.
Now I want to start adding my own stuff in static
, but everything's still being hosted by these hidden search directories provided by apps under DEBUG=True
. I've tried the following in urls.py
:
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
and
import re
from django.conf import settings
if settings.DEBUG:
static_url = re.escape(settings.STATIC_URL.lstrip('/'))
urlpatterns += patterns('',
(r'^%s(?P<path>.*)$' % static_url, 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
)
Neither have worked.
I tried providing my static directory in STATICFILES_DIRS
, but get the error ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting
. So then I tried removing my STATIC_ROOT
so the path was only given in STATICFILES_DIRS
. Finally I can access my files in development (still with staticfiles_urlpatterns
from above).
However, I'm pretty sure removing STATIC_ROOT
is not the right way to go about it. For a start, I won't be able to run collectstatic
after installing other apps without manually changing everything around again. How should I be configuring my static directory for development?
Also, is there a way to turn off hosting app specific static directories so I can make sure my single static is set up correctly (but still be in development mode)?
Upvotes: 2
Views: 2863
Reputation: 17266
OK, I completely missed the point here.
STATIC_ROOT
is for collectstatic
to pool all the static content for you. You don't add your files to here because it gets overwritten.STATIC_ROOT
and point STATIC_URL
to the url it can be found through the webserver.STATICFILES_DIRS
allows you to add your own directories for collectstatic
to search and pool to STATIC_ROOT
. Then you can nicely separate static stuff for each of your apps and/or a common project static.STATICFILES_DIRS
and hosts that, not STATIC_ROOT
because then there would be duplicates. This makes sense for larger projects because you want to be working on the per-app files, not some blob of stuff for a website.Upvotes: 3
Reputation: 599628
You're making this more complex than it needs to be. Include "static" in STATICFILES_DIRS
as you are doing, for the project-level assets, but make STATIC_ROOT
- ie the destination of the collectstatic
command - something else, probably "staticfiles", and alias that directory to /static/
in Apache. Django will serve your assets from STATICFILES_DIRS automatically, without you even needing to add the urlpatterns.
Upvotes: 3