Карта сайта и robots.txt в Django

Карта сайта призвана помочь пользователю сориентироваться на сайте, если ему не понятно в каком разделе искать нужный ему контент. Хотя я на своей практике никогда не пользовался ей. Было проще найти сайт с похожим контентом и получить нужную информацию. Поэтому делайте свою навигацию проще, интерфейс понятнее и поменьше всплывающих окон и тогда пользователь точно найдет нужную ему информацию на вашем сайте.

Второй важной причиной необходимости карты сайта является индексация контента сайта поисковыми роботами. А от этого уже зависит, будет ли поисковые системы выводить ваш сайт при запросах пользователей в поиске.

 

Django предоставляет готовые классы и механизмы для формирования файлов Sitemap.

 

Подразумевается что у вас уже есть работающее Django приложение.

 

1. В settings.py добавьте:

 


INSTALLED_APPS = [
    ... другие приложения
    'django.contrib.sites',
    'django.contrib.sitemaps',
]

SITE_ID = 1

 

2.  Выполните миграцию

 


python manage.py migrate

 

3. Создайте файл sitemap.py в вашем приложении и добавьте следующий код. 

 


from django.contrib.sitemaps import Sitemap
from .models import Post
from django.shortcuts import reverse


class PostSitemap(Sitemap):
    changefreq = "daily"
    priority = 0.8

    def items(self):
        return Post.objects.all()

    def lastmod(self, obj):
        return obj.date_pub


class StaticSitemap(Sitemap):
    priority = 0.8
    changefreq = 'daily'

    def items(self):
        return ['posts_list_url', 'faq_url', 'contacts_url']

    def location(self, item):
        return reverse(item)

 

 Карта сайта разбивается на две части. StaticSitemap - статические страницы сайта, и PostSitemap - публикации. Атрибуты changefreq и priority указывают на частоту изменения страниц post и их релевантность на сайте. 

Обязательный метод Items() вернет список объектов. Если location отсутствует, то будет вызван метод get_absolute_url() для каждого объекта post, чтобы получить его URL-адрес. В моем случае get_absolute_url() для модели post выглядит так:

 


class Post(models.Model):
    ...
    slug = models.SlugField(max_length=150, unique=True)
    date_pub = models.DateField(auto_now_add=True)
    ...

    def __str__(self):
        return '{}'.format(self.title)

    def get_absolute_url(self):
        return reverse('post_detail_url', kwargs={'slug': self.slug})

 

Метод lastmod получает каждый объект, возвращаемый items(), и возвращает последний раз, когда объект был изменен.

Метод items() класса StaticSitemap служит для отображения ссылок на статические страницы сайта. В urls.py у вас должно быть указано следующее:

 


urlpatterns = [
    ...
    path('posts/', views.posts_list, name='posts_list_url'),
    path('faq/', views.faq, name='faq_url'),
    path('contacts/', views.contacts, name='contacts_url'),
] 

 

4. Подправьте основной urls.py 

 


from blog.sitemaps import PostSitemap, StaticSitemap
from django.contrib.sitemaps.views import sitemap
from django.views.generic import TemplateView

 


sitemaps = {
    'posts': PostSitemap,
    'static': StaticSitemap,
    }

urlpatterns = [
    path('admin/', admin.site.urls),
    path('robots.txt', TemplateView.as_view(template_name="robots.txt", content_type='text/plain')),
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
    path('', include('blog.urls')),
]

 

Здесь мы формируем словарь sitemaps и подставляем его в шаблон. Обратите внимание что я подключил еще один путь. Это robots.txt в котором должна быть указана ссылка на вашу карту сайта. Создайте файл robots.txt в папке templates вашего приложения со следующим кодом:

 


User-agent: *

Sitemap: http://ваш сайт/sitemap.xml

 

 Вот так выглядит карта сайта блога:

 

В админке теперь можно посмотреть и задать имя сайта.

 

 

Не забудьте поставить корректный адрес при публикации в интернете.

 

 

Комментарии


Добавить комментарий

footer
Перепечатывание материалов сайта с указанием первоисточника приветствуется.
Копирайт © 2019 - 2021. Блог PYTHON разработчика. Все права защищены.