diff --git a/django/contrib/sitemaps/__init__.py b/django/contrib/sitemaps/__init__.py index 781ad8995d..53b375a48b 100644 --- a/django/contrib/sitemaps/__init__.py +++ b/django/contrib/sitemaps/__init__.py @@ -60,9 +60,7 @@ class Sitemap(object): return obj.get_absolute_url() def _get_paginator(self): - if not hasattr(self, "_paginator"): - self._paginator = paginator.Paginator(self.items(), self.limit) - return self._paginator + return paginator.Paginator(self.items(), self.limit) paginator = property(_get_paginator) def get_urls(self, page=1, site=None, protocol=None): diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt index e004aefd60..e0bef0b56e 100644 --- a/docs/releases/1.4.txt +++ b/docs/releases/1.4.txt @@ -1150,3 +1150,18 @@ settings file to list all your applications explicitly. This attribute was confusingly named ``HttpRequest.raw_post_data``, but it actually provided the body of the HTTP request. It's been renamed to ``HttpRequest.body``, and ``HttpRequest.raw_post_data`` has been deprecated. + +``django.contrib.sitemaps`` bugfix with potential performance implications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In previous versions the Paginator objects used in sitemap classes were +cached and could result in stale sitemap indexes. Removing this cache causes +new Paginator objects to be created and the +:attr:`~django.contrib.sitemaps.Sitemap.items()` method of the +:class:`~django.contrib.sitemaps.Sitemap` subclass to be called during every +sitemap-related request. + +If the :attr:`django.contrib.sitemaps.Sitemap.items()` method returns a +``QuerySet`` its length will be evaluated which may lead to extra database +queries. To mitigate the performance impact consider using the :doc:`caching +framework `.