I've recently been working on a project to port a web application that I wrote at work in .NET to Python, using the Django framework. I wanted to see what the advantages of using a language I'm more familiar with and adopting an agile, test-driven development methodology would be. I'm hosting it on Python Anywhere, which offers a great (and free, if your needs are relatively small) hosting service for Python web apps.
One thing to be aware of with Django is its handling of static files; there's
a whole manual page on how to go about dealing with CSS and other
assets in testing and deployment, but the short version is that the deployed
version really needs to have all of the static files collected from their apps
/app/static/app/...) to a central directory (
/static/app/...). This is
easily achieved using
./manage.py collectstatic, but means two copies of those
files in the working copy.
I already had an open issue on another Django-based project to avoid
this kind of duplication; I used a commit hook there to run
the development side, then push everything, which means that there are two copies
of the site's static files in the repository. Instead, I decided for this new
project to move the automated static collection to the
hg update command (it's
hosted on a private BitBucket repo using Mercurial, rather than Git, as I wanted
to try out the other option). This means that it runs on the server side, and
required two changes:
^static/(the static file directory in the root folder, which I'd set up as
STATIC_ROOTfor the project) to the
.hgignore, so that its contents weren't being tracked by Mercurial; and
.hg/hgrcto perform the static file collection when I update the repository.
The latter looks like:
... [hooks] update = ./manage.py collectstatic --noinput
which I think is pretty self-explanatory! Now only one copy of the CSS is kept in the central repository, but the deployed site is set up automatically when I pull down the changes from that repo and update the working copy.