Comment créer son propre sitemap en utilisant une vue avec Django ?

Published: 13 novembre 2022

Tags: Django; Sitemap;

DMCA.com Protection Status

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')