We have a long standing Django web application
to handle the process of people requesting Unix accounts here and having the official sponsor
of their account approve it. For a long time, this web app was stuck
on Python 2 and Django 1.10 after a failed attempt to upgrade to
Django 1.11 in 2019. Our reliance on Python
2 was obviously a problem, and with the not so far off end of life
of Ubuntu 20.04 it was getting more acute (we use Apache’s
mod_wsgi, and Ubuntu 22.04 and later don’t have a Python 2
version of that for obvious reasons).
Recently I decided I had to slog through the process of moving to
Python 3 and a modern Django (one that is actually supported) and
it was better to start early. To my pleasant surprise the process
of bringing it up under Python 3 and Django 4.2 was much less work
than I expected, and recently we migrated the production version. At this point
it’s been running long enough (and has done enough) that I’m calling
this upgrade a success.
There are a number of reasons for this smooth and rapid sailing.
For a start, it turns out that my 2019 work to bring the app up
under Python 3 covered most of the work
necessary, although not all of it.
Our previous problems with CSRF and
Apache HTTP Basic Authentication have either been sidestepped by
Django changes since 1.11 or perhaps mitigated by Django configuration
changes based on a greater understanding of this area that I worked out two years ago. And despite
some grumpy things I’ve said about Django in the past, our application needed very few changes to
go from Django 1.10 to Django 4.2.
(Most of the Django changes seem to have been moving from ‘load
staticfiles’ to ‘load static’ in templates, and replacing use of
django.conf.urls.url() with django.urls.re_path(), although we
could probably do our URL mapping better if we wanted to. There are
other minor changes, like importing functions from different places,
changing request.POST.has_key(X) to X in request.POST, and
defining DEFAULT_AUTO_FIELD in our settings.)
Having this migration done and working takes a real load off of my
mind for the obvious reasons; neither Python 2 nor Django 1.10 are
what we should really be using today, even if they work, and now
we’re free to upgrade the server hosting this web application beyond
Ubuntu 20.04. I’m also glad that it took relatively little work now.
(Probably this will make me more willing to keep up to date with
Django versions in the future. We’re not on Django 5.0 because it
requires a more recent version of Python 3 than Ubuntu 20.04 has,
but that will probably change this summer or fall as we start
upgrades to Ubuntu 24.04.)