Django sitemap class for named views

This sitemap class allows you to specify which named views your sitemap should include. Useful for views that don't map neatly to models, or when you don't necessarily want to include all of your flatpage or direct-to-template URLs.

Here's the sitemap code:

import datetime

from django.contrib import sitemaps
from django.core import urlresolvers

def get_named_patterns(urlconf):
    """
    Returns the named patterns in a URLconf.
    """
    named = set()
    for u in urlconf:
        if isinstance(u, urlresolvers.RegexURLPattern) and getattr(u, 'name', None) is not None:
            named.add(u)
        elif isinstance(u, urlresolvers.RegexURLResolver):
            named.update(get_named_patterns(u.url_patterns))
    return named

class NamedURLSitemap(sitemaps.Sitemap):
    """
    Given a set of URL patterns, returns sitemap items for each 
    named URL in the list passed to the constructor.
    """
    def __init__(self, patterns, names):
        self.patterns = patterns
        self.names = names

    def items(self):
        return [p for p in get_named_patterns(self.patterns) if p.name in self.names]

    def changefreq(self, obj):
        return 'daily'

    def lastmod(self, obj):
        return datetime.datetime.now()

    def location(self, obj):
        url = obj.regex.pattern.replace('^', '/').replace('$','')
        return url

Simply specify the list of named views to include in your urls.py:

sitemaps = {
    'pages': NamedURLSitemap(urlpatterns, ['home', 'about', 'privacy', 'help'])
}

urlpatterns += patterns('',
    (r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})
)

comments (2)

Dan McGee

16 November 2008

23:14

united states United States

It is a lot easier and more robust to use the urlresolvers.reverse() function. This also ensures included url configs get resolved correctly (and the prefix that was already stripped off is included in the sitemap). Your post gave me a head start on getting this implemented, so thanks for that.

from django.core.urlresolvers import reverse

class NamedURLSitemap(Sitemap):
"""
Given a set of named URLs, returns sitemap items for each.
"""
def __init__(self, names):
self.names = names

def items(self):
return self.names

def changefreq(self, obj):
return "weekly"

def lastmod(self, obj):
return datetime.datetime.now()

def location(self, obj):
return reverse(obj)

john

17 November 2008

7:10

united states United States

Yeah, you're right. Good grief. Thanks.

Comments have been turned off for this article, but you can always contact us about it.