It’s an overblown build—using Django for such a small site isn’t necessary—but it was more of an exercise than anything. The implementation is my first attempt at some best practices, namely fabric for automated deployment out of git, and pipeline for css/script minification.
Geolocation is done using the City and Country IP databases from MaxMind and uses the Django-included django.contrib.gis.geoip to read them. That resolves the lat/long, which I then send to GeoNames for to get the timezone. That result is cached in a local SQLite database to minimize lookups to GeoNames.
Overall, it was a great learning experience. Like all great learning experiences it took entirely longer than I’d originally intended; all part of the fun.