While upgrading Libravatar to a more recent version of Django, I ran into a mysterious 400 error.
In debug mode, my site was working fine, but with DEBUG = False, I would
only a page containing this error:
Bad Request (400)
with no extra details in the web server logs.
Turning on extra error logging
To see the full error message, I configured logging to a
file by
adding this to settings.py:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/debug.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}
Then I got the following error message:
Invalid HTTP_HOST header: 'www.example.com'. You may need to add u'www.example.com' to ALLOWED_HOSTS.
Temporary hack
Sure enough, putting this in settings.py would make it work outside of debug mode:
ALLOWED_HOSTS = ['*']
which means that there's a mismatch between the HTTP_HOST from Apache and the one that Django expects.
Root cause
The underlying problem was that the
Libravatar config file was missing the square brackets
around the
ALLOWED_HOSTS setting.
I had this:
ALLOWED_HOSTS = 'www.example.com'
instead of:
ALLOWED_HOSTS = ['www.example.com']