Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

[1.5.x] Fixed #19779 -- Checked contrib.sites presence in RedirectFal…

…lbackMiddleware

Thanks Aymeric Augustin for the report and directions for the patch.
Backport of 2ed90ea from master.
  • Loading branch information...
commit b8c6de31a6f08321a6cf6e3ede2dab90c9f1febd 1 parent 830b9fd
@claudep claudep authored
View
11 django/contrib/redirects/middleware.py
@@ -1,11 +1,20 @@
from __future__ import unicode_literals
+from django.conf import settings
from django.contrib.redirects.models import Redirect
from django.contrib.sites.models import get_current_site
+from django.core.exceptions import ImproperlyConfigured
from django import http
-from django.conf import settings
+
class RedirectFallbackMiddleware(object):
+ def __init__(self):
+ if 'django.contrib.sites' not in settings.INSTALLED_APPS:
+ raise ImproperlyConfigured(
+ "You cannot use RedirectFallbackMiddleware when "
+ "django.contrib.sites is not installed."
+ )
+
def process_response(self, request, response):
if response.status_code != 404:
return response # No need to check for a redirect for non-404 responses.
View
9 django/contrib/redirects/tests.py
@@ -1,9 +1,11 @@
from django.conf import settings
from django.contrib.sites.models import Site
+from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase
from django.test.utils import override_settings
from django.utils import six
+from .middleware import RedirectFallbackMiddleware
from .models import Redirect
@@ -52,3 +54,10 @@ def test_response_gone(self):
site=self.site, old_path='/initial', new_path='')
response = self.client.get('/initial')
self.assertEqual(response.status_code, 410)
+
+ @override_settings(
+ INSTALLED_APPS=[app for app in settings.INSTALLED_APPS
+ if app != 'django.contrib.sites'])
+ def test_sites_not_installed(self):
+ with self.assertRaises(ImproperlyConfigured):
+ RedirectFallbackMiddleware()
View
9 docs/ref/contrib/redirects.txt
@@ -13,11 +13,12 @@ Installation
To install the redirects app, follow these steps:
-1. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS`
- setting.
-2. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'``
+1. Ensure that the ``django.contrib.sites`` framework
+ :ref:`is installed <enabling-the-sites-framework>`.
+2. Add ``'django.contrib.redirects'`` to your :setting:`INSTALLED_APPS` setting.
+3. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'``
to your :setting:`MIDDLEWARE_CLASSES` setting.
-3. Run the command :djadmin:`manage.py syncdb <syncdb>`.
+4. Run the command :djadmin:`manage.py syncdb <syncdb>`.
How it works
============
View
1  docs/ref/contrib/sites.txt
@@ -246,6 +246,7 @@ To do this, you can use the sites framework. A simple example::
>>> 'http://%s%s' % (Site.objects.get_current().domain, obj.get_absolute_url())
'http://example.com/mymodel/objects/3/'
+.. _enabling-the-sites-framework:
Default site and ``syncdb``
===========================
View
6 docs/releases/1.5.txt
@@ -653,6 +653,12 @@ Miscellaneous
Attempting to load it with ``{% load adminmedia %}`` will fail. If your
templates still contain that line you must remove it.
+* Because of an implementation oversight, it was possible to use
+ :doc:`django.contrib.redirects </ref/contrib/redirects>` without enabling
+ :doc:`django.contrib.sites </ref/contrib/sites>`. This isn't allowed any
+ longer. If you're using ``django.contrib.redirects``, make sure
+ :setting:``INSTALLED_APPS`` contains ``django.contrib.sites``.
+
Features deprecated in 1.5
==========================
Please sign in to comment.
Something went wrong with that request. Please try again.