Exemple de comment créer son propre sitemap en utilisant une vue avec Django ?
Table des matières
Remarque : Django est fourni avec un cadre de génération de sitemap de haut niveau pour créer des fichiers XML de sitemap.voir. Cependant, j'ai dû créer mes propres sitemaps pour gérer les sous-domaines.
Créer un sitemap
Considérons par exemple un site web avec un ensemble d'articles stockés dans le modèle suivant :
class Article(models.Model):
url = models.CharField(max_length=1000, unique=True)
title = models.CharField(max_length=1000)
content = models.TextField()
date_created = models.DateTimeField(default=datetime.now)
date_modified = models.DateTimeField(default=datetime.now)
language = models.CharField(max_length=4)
removed = models.BooleanField(default=False)
exemple d'url: /Articles/MyFirstArticle/.
Pour créer un sitemap avec tous les articles, allez sur urls.py et ajoutez :
url(r'^Sitemaps/articles\.xml$', views.sitemap_article_view, name='sitemap_article_view'),
puis créez une vue qui restitue un fichier xml (SEO sitemap best practices in 2022 + cheat sheet):
def sitemap_article_view(request):
content = '''<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
'''
article_obj_list = Article.objects.filter(removed=False)
for article_obj in article_obj_list:
content += '''<url>
<loc>{}</loc>
<lastmod>{}</lastmod>
<changefreq>yearly</changefreq>
<priority>1.0</priority>
</url>'''.format(article_obj.url, datetime.date.strftime(article_obj.date_modified, "%Y-%m-%d"))
content += ''' </urlset>'''
return HttpResponse(content, content_type='text/xml')
Un autre exemple
Créez deux sitemaps pour deux sous-domaines :
www.mysite.com
fr.mysite.com
Sitemaps
def sitemap_article_view(request):
full_url = request.build_absolute_uri()
language = 'en'
if '127.0.0.1' in full_url:
url_prefix = 'http://127.0.0.1:8000'
else:
full_url_splited = full_url.split('/')
scheme = full_url_splited[0]
url_prefix = '{}//{}'.format(scheme,full_url_splited[2] )
if 'www' not in full_url:
subdomain = full_url_splited[2].split('.')[0]
language = subdomain
content = '''<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
'''
article_list_obj = Article.objects.filter(note_type='article',language=language,removed=False,public=True)
for article_obj in article_list_obj:
content += '''<url>
<loc>{}{}</loc>
<lastmod>{}</lastmod>
<changefreq>yearly</changefreq>
<priority>1.0</priority>
</url>'''.format(url_prefix,article_obj.url,datetime.date.strftime(article_obj.date_modified, "%Y-%m-%d"))
content += ''' </urlset>'''
return HttpResponse(content, content_type='text/xml')