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 views.py
:
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.