Django and app-relative static content
This one drove me a little nuts at first, but I finally realized how to do it. In the process of trying to write a little application using Django and jQuery, I found it to be annoyingly non-obvious how I should serve up a self contained set of graphical assets (like images) and my own application-local jQuery distribution. Sure, I could drop stuff in the same media root as the admin app, or tell people how to create a static mapping, but that kind of defeats modularity. I really want people to be able to drop my little application into their existing Django project or installation, add a single
include() entry into their project’s
urls.py and go.
I tried a couple of things including a manually constructed
RegexURLPattern, but it didn’t feel very clean or pythonic. Over the weekend I realized I could just write a simple delegating view function in my application’s
import os import django.views.static STATIC_ROOT = os.path.dirname(os.path.normpath(__file__)) + '/static' def static(request, path): """Return app-relative static resources and collateral.""" return django.views.static.serve(request, path, STATIC_ROOT)
With this trick and the app-relative templates loaded from the
templates/ directory (if you don’t waste time on the doc bug I found) it is quite possible to write a fully self-contained, drop-in application.