import xml.etree.ElementTree as ET from django.utils.timezone import datetime, timedelta from django.shortcuts import render from django.http import HttpResponse def robots_txt(request): txt = '''User-agent: * Disallow: Sitemap: {} '''.format(request.build_absolute_uri('/sitemap.xml')) return HttpResponse(txt, 'text/plain') def sitemap_xml(request): now = datetime.now() from .item.models import Item urlset = ET.Element('urlset') urlset.attrib['xmlns'] = "http://www.sitemaps.org/schemas/sitemap/0.9" urlset.attrib['xmlns:xsi'] = "http://www.w3.org/2001/XMLSchema-instance" urlset.attrib['xsi:schemaLocation'] = "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" url = ET.SubElement(urlset, "url") loc = ET.SubElement(url, "loc") loc.text = request.build_absolute_uri('/') lastmod = ET.SubElement(url, "lastmod") lastmod.text = now.strftime("%Y-%m-%d") changefreq = ET.SubElement(url, "changefreq") changefreq.text = 'hourly' priority = ET.SubElement(url, "priority") priority.text = '1.0' first = Item.objects.exclude(published=None).exclude(published__gt=now).order_by('published').first() if first: for year in reversed(range(first.published.year, now.year + 1)): url = ET.SubElement(urlset, "url") loc = ET.SubElement(url, "loc") loc.text = request.build_absolute_uri('/_%s/' % year) lastmod = ET.SubElement(url, "lastmod") changefreq = ET.SubElement(url, "changefreq") priority = ET.SubElement(url, "priority") if year == now.year: lastmod.text = now.strftime("%Y-%m-%d") changefreq.text = 'weekly' priority.text = '1.0' else: lastmod.text = now.strftime("%s-12-31" % year) changefreq.text = 'yearly' priority.text = '0.8' for item in Item.objects.exclude(published=None).exclude(published__gt=now).order_by('-published'): url = ET.SubElement(urlset, "url") loc = ET.SubElement(url, "loc") loc.text = request.build_absolute_uri(item.get_absolute_url()) # This date should be in W3C Datetime format, can be %Y-%m-%d lastmod = ET.SubElement(url, "lastmod") lastmod.text = item.modified.strftime("%Y-%m-%d") # always, hourly, daily, weekly, monthly, yearly, never changefreq = ET.SubElement(url, "changefreq") changefreq.text = 'daily' # priority of page on site values 0.1 - 1.0 priority = ET.SubElement(url, "priority") priority.text = '0.9' data = b'\n' + ET.tostring(urlset) return HttpResponse(data, 'application/xml')