News and such

Published: July 20, 2015. Filed under: Django, Meta.

First things first: though I announced this sort of quietly at the time, I should probably announce it publicly as well: after four years as part of the MDN development team, my final day at Mozilla was early last month. There are some parallels to the last time I moved on, so I’ll link to that in lieu of writing it all over again. For the moment I’m enjoying a summer vacation, but I’m at the stage now of starting to talk to folks about my next career move, so if you’re hiring and would like me to know about it, feel free to get in touch.

Fortunately, a bit of vacation is a good way to dive into neglected projects; ironically, in four years of working full-time on open-source code, my own personal open-source projects got very little love. As a way to keep myself motivated, I’ve added a section to this site listing projects I maintain (itself powered by one of those projects), and conspicuously listing the last release dates for each project.

My initial approach was to ensure everything on that list has had a release within the past few months; the oldest one listed now is the 1.5 release of my webcolors library, which went out in March. For a while now, webcolors has been the project I turn to for recreational programming, since it’s so unlike (read: doesn’t involve Django at all) everything else I work on, and gives me an opportunity to play around with parts of Python that I don’t ordinarily get to use. At some point I’ll probably write up some notes on that, and on why I think it’s good to regularly do some kind of coding that doesn’t resemble your day job.

Learning to love Django again

One big theme of updating all those various apps was getting to look at Django again with somewhat fresh eyes. For most of the past couple of years I’d primarily been working with a codebase that was pinned to the 1.4 long-term support release of Django, so when I started to really dive into updating my personal apps I had four versions’ worth of changes to catch up on. And it’s been a breath of fresh air.

While there were some large updates, like the landing of the migration framework, most of what I’ve actually noticed has been the little niceties and improvements made over the last three years. The one that stuck out the most to me was how well modern (that is, 1.7 and 1.8) versions of Django have cleaned up a lot of places where previously code had to be littered in specific files to ensure import-time side effects would happen.

One place where that’s really obvious is in the Django admin; the admin.autodiscover() call in your root URLconf is no longer necessary, because Django’s AppConfig system provides a clean, standardized way to ensure setup code gets run at the right time. And even the chunks of admin.site.register() calls usually found at the bottom of an admin.py file have given way to decorating the ModelAdmin subclasses themselves.

All in all, I’m incredibly happy with where Django is today, and with the fact that the project has continued to gain steam and improve this much even as most of the “old guard” of contributors have stepped back their activity. It’s nice to learn to like the framework all over again, and to know that it is and will continue to be in good hands (though I would also like to start being more active again with Django itself, after a long-ish break these past years — being an active part of a project with Django’s impact is something I’ve come to miss).

Next project steps

I also have my eye on two smaller projects that I’d like to get released, or at least suitably close to release, before the summer ends. One is the Python library which connects to the Wordpress Akismet spam-filtering service. Years ago, django-contact-form used to ship with a form subclass which routed the submission through Akismet and rejected spam, but when django-contact-form made the leap to Python 3, the Akismet library did not follow.

Fortunately, Michael Foord (the original author of the Akismet library) is a gentleman and a scholar (in addition to being one of the busiest people I know, and so I don’t begrudge him the lack of time to port Akismet to Python 3 — after all, I’m primarily writing here about how I’m trying to dig out of neglecting my own projects), and agreed to hand over the project to me. It’s up on GitHub under my account, and now that I’ve got everything else squared away, finishing the porting process to have it support Python 2 and 3 simultaneously is near the top of my to-do list.

The other project I want to dive back into is django-registration. Back when Django was young and still gaining its foothold and I was busy evangelizing to anyone who’d listen that plug-and-play applications were its killer feature, django-registration used to be my go-to (and ego-stroking, since I wrote it) example. Time was not kind to django-registration, though. Django’s own authentication system grew a lot of new features — primarily, support for custom User models — and many more people started branching out into other sources of authentication, like Oauth from popular social networks.

And so, without much fanfare, django-registration quietly died after a couple of disappointing releases that just couldn’t satisfy all the use cases being demanded of it. In the very near future, though, I plan to resurrect it and re-release it — probably as a “2.0” version to signify the change in development philosophy — with just the original simple feature set (i.e., supporting only Django’s own default User model and model-based authentication, rather than trying to support custom User models and alternate auth sources, which other applications already have taken care of that made it one of my favorite apps.

And the rest

Continuing a tradition I started back in 2007, I’ve once again moved my site, this time from cloud servers on Rackspace to the fully-managed, push-button-deploy world of Heroku. This is no knock on Rackspace; I got many years of excellent service from them, and I still have a major personal (though non-tech-related) project hosted there, due to nothing else being up to the job. But for my personal blog, a full server is just plain overkill, and maintaining a server (especially in these days of Shellshock and other frightening vulnerabilities) is not something I particularly want to do unless it’s necessary. Plus, being able to deploy code with a git push is pretty darned nice. It goes without saying that, if you’re reading this, you’re seeing it on Heroku; after a few more days to be sure everything has switched over soundly, I’ll decommission the old server at Rackspace.

Also continuing a tradition, I’ve hit a few different conferences this year and did a bit of speaking at two of them. At PyCon 2015 in MontrĂ©al, I gave an updated (for Django 1.8) version of my “Django in Depth” tutorial (slides are here if you want to follow along). And at DjangoCon EU 2015 in Cardiff, I gave a keynote on security; the video is still processing, but the slides are online.

Finally, last weekend, for the first time in my professional career, I got to attend a conference that was practically in my own backyard: Django Birthday, held in honor of the 10th anniversary of Django’s public release. Though I was only a spectator and not a speaker, I think it was — with all due respect to the organizers of PyCon and of DjangoCon EU, who both put on incredible shows — the best conference I’ve been to in a while, and I’m incredibly glad that it came together and brought lovers of Django, old and new, from around the world to my home town for a few days. It was an incredible experience, and I look forward to doing it again in another ten years.