Mercurial > public > pelican-blog
diff content/Coding/027-upgrading-django1.6.rst @ 4:7ce6393e6d30
Adding converted blog posts from old blog.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Thu, 30 Jan 2014 21:45:03 -0600 |
parents | |
children | 49bebfa6f9d3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/Coding/027-upgrading-django1.6.rst Thu Jan 30 21:45:03 2014 -0600 @@ -0,0 +1,121 @@ +Upgrading to Django 1.6 +####################### + +:date: 2013-12-29 18:00 +:tags: Django +:slug: upgrading-to-django-1.6 +:author: Brian Neal + +Getting started +=============== + +`Django`_ 1.6 came out recently, which was soon followed by 1.6.1, and it looks +like 1.6.2 is on the way. I finally got around to upgrading two of my largest +sites. I thought I would make a list of what I changed at a high level for my +own reference. Perhaps someone else may find it useful as well. + +In any event, I highly recommend you read the excellent `release notes`_ and +`deprecation timeline`_. The changes in 1.6 didn't seem groundbreaking, but +they were numerous. I spent a lot of time reading through the notes and trying +to decide if the issues affected me or not. + +I recommend you run with warnings turned on:: + + $ python -Wall manage.py runserver + +This will help you flag down issues in your code. If you aren't sure where +a warning is coming from, you can turn warnings into exceptions and get +a traceback (see the Python docs on the warnings_ library). Another trick is to +put a pdb_ breakpoint in the Django code before or after the warning, then you +can examine the call stack with the ``w`` command. + +Upgrade Issues +============== + +Here are the issues that I ran into. Of course you may have a very different +experience depending on what features of Django you used and the details of +your site. + +#. The location of the ``XViewMiddleware`` changed. I had to update my + ``MIDDLEWARE_CLASSES`` setting as a result. +#. Various ``get_query_set`` to ``get_queryset`` changes. The Django developers + have ironed out some naming inconsistencies in method names on both model + managers and ``ModelAdmin`` classes. +#. In template / form processing, the ``label_tag`` now includes the + ``label_suffix``. I noticed this when I saw that I had two colons on a form + field's label. +#. One very nice change that I am please to see is that Django now does test + discovery just like the unittest_ module in the standard library. To take + advantage of this I renamed all my test modules from ``view_tests.py`` to + ``test_views.py``, for example. This also let me get rid of ``import`` + statements in various ``__init__.py`` files in test subdirectories. In other + words, you no longer have to have silly lines like + ``from view_tests import *`` in your test packages' ``__init__.py`` files. +#. Django now supports database connection persistence. To take advantage of + this you need to set the CONN_MAX_AGE_ setting to a non-zero value. +#. The ``CACHE_MIDDLEWARE_ANONYMOUS_ONLY`` setting is now deprecated and can be + removed. For various reasons explained in the notes this never really worked + right anyway. +#. Updated to version 1.0 of the django-debug-toolbar_. The version I was using + would not work in Django 1.6. It is so good to see that this project is + being actively maintained again. There are several new panels and neat + features, check it out! +#. You now get a warning if you have a ``ModelForm`` without an ``exclude`` or + ``fields`` meta option. This is rather nice as I have been bit by this in + the past when a form suddenly started showing a newly added field that it + should not have. I added a ``fields`` option to a ``ModelForm`` as a result. + Unfortunately some third party applications I am using have this problem as + well. +#. The ``cycle`` tag has new XSS_ protection. To make use of it now, you have + to add a ``{% load cycle from future %}`` tag into your templates. +#. The ``django.contrib.auth`` password reset function is now using base 64 encoding of the + ``User`` primary key. The details are `here <https://docs.djangoproject.com/en/1.6/releases/1.6/#django-contrib-auth-password-reset-uses-base-64-encoding-of-user-pk>`_. This affected me + because I am using a custom password reset URL, and thus I needed to update + my URL pattern for both the new parameter name and the regular expression + for base 64. I missed this originally and I started getting 404's on my + password reset confirmation URLs. And yes, this is something I should have a + test for! + +What I didn't do +================ + +Many of the warnings that I got came from third party modules that I have not +updated in a long time, including Celery_ and Haystack_. I am going to have to +schedule some time to update to the latest versions of these apps. Hopefully +the warnings will be fixed in the newer versions, but if not I can write +tickets or possibly submit patches / pull requests. This is the price of +progress I suppose. + +I also use a couple of smaller third party applications that seem to be no +longer maintained. These apps are now generating some warnings. I'll have to +fork them and fix these myself. Luckily these projects are on GitHub so this +should not be a problem. + +Finally I am still facing the problem of what to do about the deprecation of +the ``AUTH_PROFILE_MODULE`` and the ``get_profile`` method. This will be +removed in Django 1.7. I've been doing some more reading about this and I'm +less scared about this than I used to. I'll probably just change my profile +model to have a one-to-one relationship with the provided ``User`` model. I'll +have to do some more researching and thinking about this before Django 1.7. + + +Conclusion +========== + +Once again the upgrade process went smoother and quicker than I thought thanks +to the excellent release notes and the Django team's use of Python warnings to +flag deprecated features. + + +.. _Django: https://www.djangoproject.com/ +.. _release notes: https://docs.djangoproject.com/en/1.6/releases/1.6/ +.. _deprecation timeline: https://docs.djangoproject.com/en/1.6/internals/deprecation/ +.. _warnings: http://docs.python.org/library/warnings.html +.. _pdb: http://docs.python.org/library/pdb.html +.. _unittest: http://docs.python.org/2/library/unittest.html +.. _CONN_MAX_AGE: https://docs.djangoproject.com/en/1.6/ref/settings/#conn-max-age +.. _XSS: http://en.wikipedia.org/wiki/Cross-site_scripting +.. _configurable user model: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#auth-custom-user +.. _django-debug-toolbar: https://pypi.python.org/pypi/django-debug-toolbar +.. _Celery: http://www.celeryproject.org/ +.. _Haystack: http://haystacksearch.org/