Fixed #2713 -- Made the name of the sitemap view a parameter of the sitemap index view, in order to allow decorators. Also cleaned up code in the area and removed redundant comments from the tests.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17408 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Aymeric Augustin 2012-01-29 09:30:28 +00:00
parent d9061c01a9
commit 123f567093
4 changed files with 50 additions and 22 deletions

View File

@ -37,9 +37,7 @@ class SitemapTests(TestCase):
def test_simple_sitemap_index(self): def test_simple_sitemap_index(self):
"A simple sitemap index can be rendered" "A simple sitemap index can be rendered"
# Retrieve the sitemap.
response = self.client.get('/simple/index.xml') response = self.client.get('/simple/index.xml')
# Check for all the important bits:
self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?> self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>%s/simple/sitemap-simple.xml</loc></sitemap> <sitemap><loc>%s/simple/sitemap-simple.xml</loc></sitemap>
@ -48,9 +46,7 @@ class SitemapTests(TestCase):
def test_simple_sitemap_custom_index(self): def test_simple_sitemap_custom_index(self):
"A simple sitemap index can be rendered with a custom template" "A simple sitemap index can be rendered with a custom template"
# Retrieve the sitemap.
response = self.client.get('/simple/custom-index.xml') response = self.client.get('/simple/custom-index.xml')
# Check for all the important bits:
self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?> self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a customised template --> <!-- This is a customised template -->
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@ -60,9 +56,7 @@ class SitemapTests(TestCase):
def test_simple_sitemap(self): def test_simple_sitemap(self):
"A simple sitemap can be rendered" "A simple sitemap can be rendered"
# Retrieve the sitemap.
response = self.client.get('/simple/sitemap.xml') response = self.client.get('/simple/sitemap.xml')
# Check for all the important bits:
self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?> self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>%s/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url> <url><loc>%s/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
@ -71,9 +65,7 @@ class SitemapTests(TestCase):
def test_simple_custom_sitemap(self): def test_simple_custom_sitemap(self):
"A simple sitemap can be rendered with a custom template" "A simple sitemap can be rendered with a custom template"
# Retrieve the sitemap.
response = self.client.get('/simple/custom-sitemap.xml') response = self.client.get('/simple/custom-sitemap.xml')
# Check for all the important bits:
self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?> self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a customised template --> <!-- This is a customised template -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@ -98,13 +90,10 @@ class SitemapTests(TestCase):
def test_generic_sitemap(self): def test_generic_sitemap(self):
"A minimal generic sitemap can be rendered" "A minimal generic sitemap can be rendered"
# Retrieve the sitemap.
response = self.client.get('/generic/sitemap.xml') response = self.client.get('/generic/sitemap.xml')
expected = '' expected = ''
for username in User.objects.values_list("username", flat=True): for username in User.objects.values_list("username", flat=True):
expected += "<url><loc>%s/users/%s/</loc></url>" % (self.base_url, username) expected += "<url><loc>%s/users/%s/</loc></url>" % (self.base_url, username)
# Check for all the important bits:
self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?> self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
%s %s
@ -145,9 +134,7 @@ class SitemapTests(TestCase):
# Make sure hitting the flatpages sitemap without the sites framework # Make sure hitting the flatpages sitemap without the sites framework
# installed doesn't raise an exception # installed doesn't raise an exception
Site._meta.installed = False Site._meta.installed = False
# Retrieve the sitemap.
response = self.client.get('/simple/sitemap.xml') response = self.client.get('/simple/sitemap.xml')
# Check for all the important bits:
self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?> self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://testserver/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url> <url><loc>http://testserver/location/</loc><lastmod>%s</lastmod><changefreq>never</changefreq><priority>0.5</priority></url>
@ -182,3 +169,14 @@ class SitemapTests(TestCase):
return isinstance(url['item'], User) return isinstance(url['item'], User)
item_in_url_info = all(map(is_user, user_sitemap.get_urls())) item_in_url_info = all(map(is_user, user_sitemap.get_urls()))
self.assertTrue(item_in_url_info) self.assertTrue(item_in_url_info)
def test_cached_sitemap_index(self):
"""
Check that a cached sitemap index can be rendered (#2713).
"""
response = self.client.get('/cached/index.xml')
self.assertEqual(response.content, """<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>%s/cached/sitemap-simple.xml</loc></sitemap>
</sitemapindex>
""" % self.base_url)

View File

@ -1,7 +1,8 @@
from datetime import datetime from datetime import datetime
from django.conf.urls import patterns from django.conf.urls import patterns, url
from django.contrib.sitemaps import Sitemap, GenericSitemap, FlatPageSitemap from django.contrib.sitemaps import Sitemap, GenericSitemap, FlatPageSitemap, views
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.views.decorators.cache import cache_page
class SimpleSitemap(Sitemap): class SimpleSitemap(Sitemap):
changefreq = "never" changefreq = "never"
@ -28,10 +29,17 @@ flatpage_sitemaps = {
urlpatterns = patterns('django.contrib.sitemaps.views', urlpatterns = patterns('django.contrib.sitemaps.views',
(r'^simple/index\.xml$', 'index', {'sitemaps': simple_sitemaps}), (r'^simple/index\.xml$', 'index', {'sitemaps': simple_sitemaps}),
(r'^simple/custom-index\.xml$', 'index', {'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap_index.xml'}), (r'^simple/custom-index\.xml$', 'index',
(r'^simple/sitemap-(?P<section>.+)\.xml$', 'sitemap', {'sitemaps': simple_sitemaps}), {'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap_index.xml'}),
(r'^simple/sitemap-(?P<section>.+)\.xml$', 'sitemap',
{'sitemaps': simple_sitemaps}),
(r'^simple/sitemap\.xml$', 'sitemap', {'sitemaps': simple_sitemaps}), (r'^simple/sitemap\.xml$', 'sitemap', {'sitemaps': simple_sitemaps}),
(r'^simple/custom-sitemap\.xml$', 'sitemap', {'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap.xml'}), (r'^simple/custom-sitemap\.xml$', 'sitemap',
{'sitemaps': simple_sitemaps, 'template_name': 'custom_sitemap.xml'}),
(r'^generic/sitemap\.xml$', 'sitemap', {'sitemaps': generic_sitemaps}), (r'^generic/sitemap\.xml$', 'sitemap', {'sitemaps': generic_sitemaps}),
(r'^flatpages/sitemap\.xml$', 'sitemap', {'sitemaps': flatpage_sitemaps}), (r'^flatpages/sitemap\.xml$', 'sitemap', {'sitemaps': flatpage_sitemaps}),
url(r'^cached/index\.xml$', cache_page(1)(views.index),
{'sitemaps': simple_sitemaps, 'sitemap_url_name': 'cached_sitemap'}),
url(r'^cached/sitemap-(?P<section>.+)\.xml', cache_page(1)(views.sitemap),
{'sitemaps': simple_sitemaps}, name='cached_sitemap')
) )

View File

@ -4,7 +4,9 @@ from django.core.paginator import EmptyPage, PageNotAnInteger
from django.http import Http404 from django.http import Http404
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
def index(request, sitemaps, template_name='sitemap_index.xml', mimetype='application/xml'): def index(request, sitemaps,
template_name='sitemap_index.xml', mimetype='application/xml',
sitemap_url_name='django.contrib.sitemaps.views.sitemap'):
current_site = get_current_site(request) current_site = get_current_site(request)
sites = [] sites = []
protocol = request.is_secure() and 'https' or 'http' protocol = request.is_secure() and 'https' or 'http'
@ -14,14 +16,15 @@ def index(request, sitemaps, template_name='sitemap_index.xml', mimetype='applic
pages = site().paginator.num_pages pages = site().paginator.num_pages
else: else:
pages = site.paginator.num_pages pages = site.paginator.num_pages
sitemap_url = urlresolvers.reverse('django.contrib.sitemaps.views.sitemap', kwargs={'section': section}) sitemap_url = urlresolvers.reverse(sitemap_url_name, kwargs={'section': section})
sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url)) sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url))
if pages > 1: if pages > 1:
for page in range(2, pages+1): for page in range(2, pages+1):
sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page)) sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page))
return TemplateResponse(request, template_name, {'sitemaps': sites}, content_type=mimetype) return TemplateResponse(request, template_name, {'sitemaps': sites}, content_type=mimetype)
def sitemap(request, sitemaps, section=None, template_name='sitemap.xml', mimetype='application/xml'): def sitemap(request, sitemaps, section=None,
template_name='sitemap.xml', mimetype='application/xml'):
maps, urls = [], [] maps, urls = [], []
if section is not None: if section is not None:
if section not in sitemaps: if section not in sitemaps:

View File

@ -293,11 +293,30 @@ You should create an index file if one of your sitemaps has more than 50,000
URLs. In this case, Django will automatically paginate the sitemap, and the URLs. In this case, Django will automatically paginate the sitemap, and the
index will reflect that. index will reflect that.
.. versionadded:: 1.3 .. versionadded:: 1.4
If you are not using the vanilla sitemap view -- for example, if it is wrapped
with a caching decorator -- you must name your sitemap view and pass
``sitemap_url_name`` to the index view::
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
urlpatterns = patterns('',
url(r'^sitemap.xml$',
cache_page(86400)(sitemaps_views.index),
{'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
url(r'^sitemap-(?P<section>.+)\.xml$',
cache_page(86400)(sitemaps_views.sitemap),
{'sitemaps': sitemaps}, name='sitemaps'),
)
Template customization Template customization
====================== ======================
.. versionadded:: 1.3
If you wish to use a different template for each sitemap or sitemap index If you wish to use a different template for each sitemap or sitemap index
available on your site, you may specify it by passing a ``template_name`` available on your site, you may specify it by passing a ``template_name``
parameter to the ``sitemap`` and ``index`` views via the URLconf:: parameter to the ``sitemap`` and ``index`` views via the URLconf::