1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- import datetime
- from calendar import timegm
- from functools import wraps
-
- from django.contrib.sites.shortcuts import get_current_site
- from django.core.paginator import EmptyPage, PageNotAnInteger
- from django.http import Http404
- from django.template.response import TemplateResponse
- from django.urls import reverse
- from django.utils.http import http_date
-
-
- def x_robots_tag(func):
- @wraps(func)
- def inner(request, *args, **kwargs):
- response = func(request, *args, **kwargs)
- response['X-Robots-Tag'] = 'noindex, noodp, noarchive'
- return response
- return inner
-
-
- @x_robots_tag
- def index(request, sitemaps,
- template_name='sitemap_index.xml', content_type='application/xml',
- sitemap_url_name='django.contrib.sitemaps.views.sitemap'):
-
- req_protocol = request.scheme
- req_site = get_current_site(request)
-
- sites = [] # all sections' sitemap URLs
- for section, site in sitemaps.items():
- # For each section label, add links of all pages of its sitemap
- # (usually generated by the `sitemap` view).
- if callable(site):
- site = site()
- protocol = req_protocol if site.protocol is None else site.protocol
- sitemap_url = reverse(sitemap_url_name, kwargs={'section': section})
- absolute_url = '%s://%s%s' % (protocol, req_site.domain, sitemap_url)
- sites.append(absolute_url)
- # Add links to all pages of the sitemap.
- for page in range(2, site.paginator.num_pages + 1):
- sites.append('%s?p=%s' % (absolute_url, page))
-
- return TemplateResponse(request, template_name, {'sitemaps': sites},
- content_type=content_type)
-
-
- @x_robots_tag
- def sitemap(request, sitemaps, section=None,
- template_name='sitemap.xml', content_type='application/xml'):
-
- req_protocol = request.scheme
- req_site = get_current_site(request)
-
- if section is not None:
- if section not in sitemaps:
- raise Http404("No sitemap available for section: %r" % section)
- maps = [sitemaps[section]]
- else:
- maps = sitemaps.values()
- page = request.GET.get("p", 1)
-
- lastmod = None
- all_sites_lastmod = True
- urls = []
- for site in maps:
- try:
- if callable(site):
- site = site()
- urls.extend(site.get_urls(page=page, site=req_site,
- protocol=req_protocol))
- if all_sites_lastmod:
- site_lastmod = getattr(site, 'latest_lastmod', None)
- if site_lastmod is not None:
- site_lastmod = (
- site_lastmod.utctimetuple() if isinstance(site_lastmod, datetime.datetime)
- else site_lastmod.timetuple()
- )
- lastmod = site_lastmod if lastmod is None else max(lastmod, site_lastmod)
- else:
- all_sites_lastmod = False
- except EmptyPage:
- raise Http404("Page %s empty" % page)
- except PageNotAnInteger:
- raise Http404("No page '%s'" % page)
- response = TemplateResponse(request, template_name, {'urlset': urls},
- content_type=content_type)
- if all_sites_lastmod and lastmod is not None:
- # if lastmod is defined for all sites, set header so as
- # ConditionalGetMiddleware is able to send 304 NOT MODIFIED
- response['Last-Modified'] = http_date(timegm(lastmod))
- return response
|