Содержание
Генерация Sitemap на микросервисах
Яна Сидорова
Middle backend developer Hawking Bros
Мы продолжаем цикл статей о микросервисной архитектуре. В прошлый раз мы говорили о переходе на микросервисную архитектуру. В этот раз речь пойдёт о генерации файла sitemap.xml и о нашем решении этой задачи
Введение
Что такое Sitemap?
Sitemap — файл формата xml, который содержит информацию о страницах сайта: URL-адреса, типы файлов, даты публикаций статей и так далее. Нужно предоставить этот файл поисковой системе, чтобы страницы сайта правильно индексировались для поиска.
Когда Sitemap нужен?
Если сайт уже построен на микросервисной архитектуре, не нужно объяснять, что не все ссылки на страницы находятся в верхнем меню. Скорее всего, это сложная система, содержащая большое количество контента, и этот контент хотелось бы показывать пользователю при поиске в Google.
В чём проблема?
Существуют автоматические генераторы, но они работают только со статичной и редко обновляемой информацией. Значит нужно писать свой метод: собрать все статичные URL, сгенерировать динамические, исходя из информации в базе данных; затем создать файл и наполнить его, не забывая про структуру XML-документа.
Проблема при использовании микросервисной архитектуры заключается в том, что базы данных микросервисов автономны и изолированы, в каждой из них находятся данные, которые нужно получать по отдельному запросу. Где расположить метод генерации Sitemap? Будет ли он отправлять запрос в каждый микросервис? Сколько времени занимает сбор данных? Где вообще хранить файл sitemap.xml?
Решить задачу можно разными способами, мы же поделимся своим видением.
Схема и технологии
Ситуация
В нашем примере сайт — интернет-магазин с более чем сотней тысяч товаров. Компания имеет около 50 филиалов, каждый со своей страницей контактов, блогом с новостями и акциями и тому подобным. Все эти сущности разделены по микросервисам.
Технологии
PHP-фреймворк Laravel, брокер очередей Kafka, поисковая система ElasticSearch в качестве хранилища данных, СУБД PostgreSQL. Взаимодействие между frontend и backend реализовано с помощью REST API.
Суть
Итак, для генерации готового файла sitemap.xml требуется:
- Дать команду на сбор адресов страниц микросервисам, которые должны их генерировать.
- Сохранить сгенерированные данные в общем хранилище.
- Дать команду на получение и форматирование этих данных в формат xml.
- Сохранить сгенерированный xml-файл для быстрого доступа при запросе.
Для получения:
- Отправить API-запрос в соответствующий микросервис.
- Получить содержимое файла из быстрого доступа или из внешнего хранилища.
- Отдать данные в ответе.
Для этого нам потребуются брокер сообщений и внешнее хранилище.
В качестве брокера сообщений на данном примере используется Kafka, за внешнее хранилище отвечает ElasticSearch.
В Kafka отправляется сообщение о генерации sitemap (по нажатию кнопки в административной панели, из cron-задачи или напрямую из терминала). Конкретно этот тип сообщения прослушивают только те микросервисы, которые должны участвовать в сборе адресов. Далее методы микросервисов внутри себя проходятся по заданным константами статичным урлам, по своей БД, если требуется, а также формируют часть файла и сохраняют её в документ заранее созданного индекса.
Генерация Sitemap
Теперь, чтобы взять эти данные и составить из них документ, определённый микросервис (например, seo) принимает API запрос.
Чтобы вернуть ответ, сначала методы микросервиса seo смотрят в кэш. Время хранения кэша зависит от частоты обновляемых данных, в нашем случае это один день. Если в кэше нужных данных не оказалось, методы ищут их в базе данных микросервиса c датой обновления не ранее суток. Если же данных нет и там, происходит следующий процесс.
Микросервис обращается к индексу ElasticSearch, получает части файла, объединяет и применяет к ним нужное форматирование. Затем содержимое файла сохраняется в базу данных, кэшируется для дальнейшего быстрого доступа и отдаётся в ответе. Файл не хранится физически, его данные собираются из частей во внешнем хранилище. Мы настроили наш веб-сервер таким образом, чтобы при переходе на /sitemap.xml посылался запрос на backend, который в свою очередь отдаёт сгенерированный xml.
Получение Sitemap
Заключение
Таким образом, при запросе sitemap.xml из браузера, веб-сервер посылает API-запрос к микросервису seo и полученный ответ подставляется на страницу.
Такая схема позволяет легко добавлять в процесс генерации файла новые микросервисы. Для этого нужно подключить их к прослушиванию сообщения и реализовать методы сбора адресов внутри себя.
Использование очереди сообщений позволяет не ждать ответа последовательных запросов к каждому микросервису, а генерировать части файла асинхронно, чтобы избежать ошибки 504 Gateway Time Out.
Если какой-то микросервис недоступен или генерация закончилась ошибкой, часть адресов просто не попадёт в общий список, а ошибку можно будет легко отследить в логах. Зато сам sitemap. xml будет всегда доступен, даже во время обновления адресов, так как за получение файла отвечает другой запрос.
Реклама на Tproger: найдем для вас разработчиков нужного стека и уровня.
Подробнее
Реклама на tproger.ru
Загрузка
новейших вопросов о «django-sitemaps»
Задай вопрос
Фреймворк Django для создания карт сайта
- Учить больше…
- Лучшие пользователи
- Синонимы
53
вопросы
Новейший
Активный
Баунти
Без ответа
Фильтровать по
Нет ответов
Ответ не принят
Имеет награду
Отсортировано по
Новейший
Последние действия
Наивысший балл
Самый частый
Щедрость скоро закончится
Отмечен
Мои просматриваемые теги
Следующие теги:
0
голоса
1
отвечать
17
Просмотры
Django Sitemap не работает, выдает ошибку «Реверс для« индекса »не найден.
« Индекс »не является допустимой функцией представления или именем шаблона».
Я пытаюсь реализовать файл Sitemap для своего приложения и получаю сообщение об ошибке
«Реверс для« индекса »не найден.« Индекс »не является допустимой функцией представления или именем шаблона».
хотя эти представления настроены.
…
- django
- django-urls
- django-карты сайта
0
голоса
0
ответы
37
Просмотры
Динамическая карта сайта Django для неиспользования модели и использования только API
Пожалуйста, помоги мне. Я разрабатываю проект электронной коммерции odoo. Я использую интерфейс с фреймворком Django и серверную часть с python. Я передаю api из бэкенда в интерфейс Django. Подскажите пожалуйста как написать…
- django
- sitemap.xml
- django-sitemaps
0
голоса
1
отвечать
81
Просмотры
sitemap.xml работает при разработке, но 404 ошибки при производстве
Я следил за документацией, чтобы добавить карту сайта на свой веб-сайт, все отлично работает при разработке, после загрузки в рабочую среду у меня возникает ошибка 404, поскольку карта сайта не может быть найдена. Я проверил …
- питон
- джанго
- карты сайта джанго
0
голоса
0
ответы
113
Просмотры
Карта сайта Django i18n повторяет язык по умолчанию, не включает URL-адреса для языков, отличных от используемых по умолчанию.
Используя Django 4.0.6, у меня есть карты сайта, которые отлично работают для одного языка по умолчанию — английского. После добавления i18n карта сайта не показывает URL-адреса для других языков, а вместо этого повторяет URL-адрес на английском языке,…
- django
- интернационализация
- карта сайта
- django-i18n
- django-sitemaps
0
голоса
1
отвечать
25
Просмотры
sitemaps возвращает NoReverseMatch в /sitemap.xml
Я пытаюсь добавить карты сайта в свое приложение, но когда я добавляю URL-адрес с ярлыком, он выдает ошибку в http://127.0.0.1:8000/sitemap.xml.
Реверс для ‘view-Question’ без аргументов не найден. 1 …
- питон
- django
- django-urls
- django-sitemaps
0
голоса
0
ответы
61
Просмотры
Django GenericSitemap: Проблема с моделью
Я пытаюсь создать карту сайта Django с помощью функции GenericSitemap.
мой файл urls.py выглядит так:
из пути импорта django.urls
от . импорт просмотров
из импорта django.views.generic.base…
- django
- карта сайта
- django-карты сайта
0
голоса
0
ответы
68
Просмотры
Карта сайта django добавить URL-адреса динамического набора запросов
На моем веб-сайте django я пытаюсь создать карту сайта с помощью приложения карты сайта django, я обнаружил трудности с добавлением некоторых URL-адресов, отфильтрованных набором запросов, простыми словами на моей домашней странице у меня есть URL / где вы …
- python
- django
- django-urls
- карта сайта
- django-карты сайта
0
голоса
1
отвечать
31
Просмотры
Django siteframework, как часто django создает файл sitemap.
xml?
У меня есть фреймворк сайта Django для создания динамического листа sitemap.xml.
класс NewsSitemap(Карта сайта):
changefreq = «ежедневно»
приоритет = 0,8
протокол = ‘https’
элементы защиты (я):
…
- django
- сайты django
- карты сайта django
0
голоса
1
отвечать
143
Просмотры
Динамический набор запросов в карте сайта django
У меня более 100 000 000 URL-адресов страниц. Как сделать QuerySet динамическим в том смысле, что каждый класс будет иметь 10 000 уникальных URL-адресов, не создавая вручную целые числа в 10 000 классов?
# …
- питон
- джанго
- джанго-карты сайта
0
голоса
2
ответы
193
Просмотры
Django — удалить косую черту из «sitemap.xml/»
Я использую структуру карты сайта Django и имею индекс карты сайта. Мой файл URL выглядит так:
URL = [
путь(», включить(‘фильмы.urls’)),
путь(», включить(‘accounts.urls’)),
…
дорожка(‘…
- django
- xml-карта сайта
- django-карты сайта
0
голоса
1
отвечать
225
Просмотры
Django — Карта сайта — Установка абсолютных URL-адресов вручную
Я создаю карту сайта, но веб-сайт, для которого предназначена эта карта сайта, имеет другую маршрутизацию URL-адресов и другой домен.
Я думал, что метод переопределения местоположения будет работать, но проблема в том, что Django…
- python
- django
- карта сайта
- django-карты сайта
0
голоса
1
отвечать
107
Просмотры
Как добавить косую черту (/) в URL карты сайта Django?
Я хочу добавить (/) на карту сайта Django. Я использовал следующий код для создания карты сайта в django.
мой url.py
из django.contrib.sitemaps.views импортировать карту сайта
из импорта myApp.sitemaps…
- django
- django-views
- django-карты сайта
0
голоса
1
отвечать
124
Просмотры
Страница не найдена (404) ошибка при поиске на странице поиска Поднято: blog.
views.blogpost
я не могу выполнить поиск и получить ошибку 404. Такая же проблема возникает в представлениях карты сайта для создания статического файла xml,
он не возвращает URL-адрес статического файла, и теперь у него проблема с поиском, как есть…
- django
- django-views
- django-templates
- django-sitemaps
2
голоса
1
отвечать
555
Просмотры
Реверс для ‘django.contrib.sitemaps.views.sitemap’ с аргументами ключевого слова ‘{‘section’: ‘evergreen’}’ не найден
Джанго 3.0.8
Питон 3.8.0
Как я могу справиться с разделами карты сайта?
класс EvergreenPostSitemap(Карта сайта):
changefreq = ‘ежемесячно’
приоритет = 0,8
протокол = ‘https’
элементы защиты (я):
. ..
- джанго
- джанго-карты сайта
1
голосование
1
отвечать
389
Просмотры
Карта сайта Django.xml. Почему я получаю example.com в файле?
Я генерирую sitemap.xml на сервере разработки, но вместо 127.0.0.1 я получаю example.com в URL-адресе. У меня нигде в коде нет ссылки на example.com.
—<набор адресов>
—<адрес>
<место&...
- django-сайты
- django-карты сайта
на страницу
Генератор карты сайта — Трясогузка Документация 4.1.1 документация
В этом документе описывается, как создавать XML-карты сайта для вашего веб-сайта трясогузки.
с помощью модуля wagtail. contrib.sitemaps
.
Примечание
Начиная с версии Wagtail 1.10, приложение Django contrib sitemap используется для создания
карты сайта. Однако, поскольку трясогузка требует, чтобы экземпляр Site был доступен
во время создания карты сайта вам придется использовать представления из
wagtail.contrib.sitemaps.views
модуль вместо просмотров
предоставлено Django ( django.contrib.sitemaps.views
).
В остальном использование этих представлений идентично, что означает, что
настройка и кэширование карт сайта выполняются с использованием Django по умолчанию.
узоры. Подробную информацию смотрите в документации Django.
Базовая конфигурация
Сначала вам нужно добавить "django.contrib.sitemaps"
в INSTALLED_APPS в вашем
Файл настроек Джанго:
УСТАНОВЛЕННЫЕ_ПРИЛОЖЕНИЯ = [ ... "django.contrib.sitemaps", ]
Затем в urls.py
нужно добавить ссылку на
wagtail. contrib.sitemaps.views.sitemap
представление, которое генерирует
карта сайта:
из wagtail.contrib.sitemaps.views импортировать карту сайта URL-шаблоны = [ ... путь('sitemap.xml', карта сайта), ... # Убедитесь, что строка 'sitemap' отображается над маршрутом обслуживания страницы трясогузки по умолчанию. re_path(r'', include(wagtail_urls)), ]
Теперь вы сможете перейти к /sitemap.xml
и увидеть карту сайта.
за работой. По умолчанию все опубликованные страницы вашего сайта будут добавлены в
карта сайта.
Установка имени хоста
По умолчанию карта сайта использует имя хоста, указанное в
участков
площадь. Если ваш сайт по умолчанию называется localhost
, то URL-адреса в
карта сайта будет выглядеть так:
<ссылка>http://localhost/about/ <последний мод>2015-09-26
Чтобы такие инструменты, как Google Search Tools, правильно индексировали ваш сайт, вам необходимо установить
действительное, доступное для сканирования имя хоста. Если вы измените имя хоста сайта с
localhost
to mysite.com
, sitemap.xml
будет содержать правильные URL-адреса:
<ссылка>http://mysite.com/about/ 2015-09-26
Если изменить порт сайта на 443
будет использоваться схема https
.
Узнайте больше о работе с Сайтами.
Настройка
URL-адреса
Класс Page
определяет метод get_sitemap_urls
, который вы можете
переопределить, чтобы настроить карты сайта для каждого экземпляра Page
. Этот метод должен принимать
объект запроса и возвращает список словарей, один словарь на URL
запись в карту сайта. Вы можете исключить страницы из карты сайта, вернув
пустой список.
Каждый словарь может содержать следующее:
Вы можете добавить больше, но вам нужно переопределить
шаблон sitemap.xml
для того, чтобы они отображались в карте сайта.