The TimeToLead.eu technical stack: Django and Flex

As discussed previously, at Torchbox we recently built TimeToLead.eu, an advocacy site set up by the four major environmental NGOs to prompt MEPs into passing the sort of legislation the world's climate desperately needs. The project itself needed a fast turnaround time, and its pan-European audience demanded strong i18n and l10n. This had to be in place at all layers, including an embedded Flex application.

In a parallel with the acronym LAMP, the overall stack is probably best described as "LAPD":

  • Linux
  • Apache
  • PostgreSQL
  • Django

although there are refinements at almost every level, which I'll go into below.

I18n with Django was a joy to implement. We had to have the site translated in six languages, but this was practically a doddle with Django's core internationalization behaviour. Before we'd put the translations in, I clicked on "POLSKI" and was sure the l10n wasn't working, until I spotted that the "ENGLISH" link had magically changed to "ANGIELSKI".

The only issue we've had---which we're hoping to work around---was deciding on an initial translation when the visitor arrived for the first time. Some parts of the system seemed to need l10n---the plumping for a specific version of the site---before Django's LocaleMiddleware had done that for us, so we've had to force English until the user states otherwise. I'm hoping that a version 2 rewrite will fix that.

PostgreSQL might seem an odd choice of database to the LAMP community, who are used to MySQL's minuscule overhead and often actively work around its deficiencies to keep that low overhead. But PostgreSQL's stability and maturity outweigh the performance issues which---with a little care and attention---it's possible to at least partly mitigate.

Compared to MySQL or Oracle, PostgreSQL also has the accolade of being supported by Django but having no outstanding database issues. Whether that's because nobody else uses it, or because the integration is tight and relatively bug-free, I daren't comment, but we've had nothing but seamless, transparent behaviour thus far.

Our Django-oriented hosting is with Webfaction, who are geared up for one-click mod_python Django deployments. The Django app sits in its own Apache process, while static files are served by the Linux server's main Apache process: differential serving of content lets us take advantage of differential hosting fees. The hosting is a pretty good package, although TimeToLead.eu (despite being a pretty small application) is already finding the maximum memory package a bit restrictive, so we'll need to keep an eye on that.

On top of this, Django has to a greater or lesser extent enabled us to use a whole host of other neat little technologies to integrate the site and improve both the user and the developer's experience:

  • The main Flash widget is written in Flex: I'm no particular fan of Flash myself, but it fulfills the remit admirably here. Because of text flow issues, there are actually six versions of the Flash file, one for each language, but the majority of the explanatory text is then picked up from an XML feed provided by Django, so can be retranslated by the client without recompiling Flex.
  • Swfobject serves up our main widget and the YouTube file. It degrades well, but bear in mind that the API to it has changed considerably in the most recent major version.
  • Unit tests in Django cover a number of stress points in the code (although not all, owing to the timescale). Towards the end, we were testing any major functionality changes by writing the tests first, which I was really pleased with.
  • BeautifulSoup, which I mentioned a few days ago, is employed in the unit tests to check that certain content is coming through on the front end. It also managed to help us proof against a browser-dependent FOUC we encountered during development.
  • Translations are managed by the Django application Rosetta: the most recent stable version is for Django 0.96 but the bleeding-edge repository copy seems to work OK on 1.0b1

Django has been the saviour here, living up to its promise as a framework for rapid application development. No framework is ever perfect, and there'll always be arguments over the right way to proceed, reconciling what the framework developers want you to do with what the end developer wants to do, but this particular brief sojourn alongside Holovaty, Kaplan-Moss, Willison et al has been tremendous fun.

Comments

>>I’m no particular fan of Flash myself, but it fulfills the remit admirably here.

What's with the qualification? Is that to maintain some sort of nerd cred? Why are you not a 'fan of flash'? Hate video that runs nicely? Hate a 96% install base with no cross browser problems? I mean seriously, hating Flash is totally '02.

Have you noticed the Adblock (non-Plus version) extension for firefox completely blocks any and all SWFObject loaded SWFs?

I'm sorry if me expressing an opinion about Flash galls you so much that you have to write impolite rhetorical questions about it on a post that almost entirely talks about other technologies. I had no idea it would touch a nerve.

I appreciate that you're probably a busy person, and you therefore expect me to provide citations and user studies to back up every single opinion I express, that you might possibly like to quibble with, every time I write something and publish it on the web. But I'm a busy person too, and I'm writing blog posts here, not an encyclopaedia. I have mentioned my opinions on Flash in previous blog posts, but only tangentially, because I don't care about it as much as you seem to do.

In my limited experience there do exist cross-browser problems, and along with proprietary lockin and binary transmission they're something that I might discuss at a later date when someone asks me more nicely than you have. In addition, its ubiquity if anything makes software like Adblock harder to implement in a targeted manner.

Oddly, I didn't actually mind Flash in 2002; I'm starting to dislike it again now. I console myself with the fact that some people are destined to be entirely out of touch with current fashions. You should see my wardrobe.