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)
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)
Comments have been turned off for this article, but you can always contact us about it.