Автономное SЕО у себя на сайте

Работа с файлом sitemap.xml для поисковых роботов на фреймворке Sanic. Sitemap — это файл со ссылками на страницы сайта, который сообщает поисковым системам об актуальной структуре сайта. Яндекс поддерживает форматы XML и TXT. Формат XML позволяет передавать дополнительную информацию.

Автономное SЕО у себя на сайте.Sitemap, увеличит покрытие индексируемости вашего сайта и улучшить его видимость в результатах поиска. Поддерживаемые Яндексом, читай .
Содержание файла sitemap.xml, образец.

<?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        <url>
            <loc>http://www.example.com/page1.html</loc>
            <lastmod>2005-01-01</lastmod>
            <changefreq>monthly</changefreq>
            <priority>0.8</priority>
        </url>
    </urlset>

Сделаем импорт from sanic import Sanic, response, text и import aiofiles.

Создадим директорию, где будем хронить файлы.

Реализация на основе классов.

from sanic.views import HTTPMethodView

class SiteMapView(HTTPMethodView):
    async def get(self, request):
        return  await response.file("./files/sitemap.xml")


class SiteMapView(HTTPMethodView):

    async def get(self, request):
        xml_content = ""
        async with aiofiles.open("./files/sitemap.xml", 'r') as f:
              xml_content = await f.read()

        return text(xml_content, headers={'Content-Type': 'text/xml'})

Реализация на основе функций.

@app.get("/sitemap.xml")
async def xml_get(request):
    xml_content = ""
    async with aiofiles.open("./files/sitemap.xml", 'r') as f:
          xml_content = await f.read()

    return text(xml_content, headers={'Content-Type': 'text/xml'})


@app.get("/sitemap.xml")
async def xml_get(request):
    return  await response.file("./files/sitemap.xml")

Рассмотрим вариант автономной генерации файла sitemap.xml с помощью jinja2 (python).
Здесь просто, ясно и понятно(читай). Самый простой способ настроить Jinja2 для загрузки шаблонов для вашего приложения выглядит примерно так.

from jinja2 import Environment, FileSystemLoader

lst_pages = ["http://www.example.com/page1.html", "http://www.example.com/page2.html"]

file_loader = FileSystemLoader('tpl')
env = Environment(loader=file_loader)

tm = env.get_template('sitemap.xml')
msg = tm.render(pages=lst_pages)

print(msg)


#in sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
       {% for page in pages %}
        <url>
            <loc>{{page}}</loc>
            <lastmod>2005-01-01</lastmod>
            <changefreq>monthly</changefreq>
            <priority>0.8</priority>
        </url>
        {% endfor %}
    </urlset>

Наше приложение работает на асинхронном движке ( async/await python). Проще всего для нас, обернуть этот код в функцию.
Пример:

file_loader = FileSystemLoader('tpl')
env = Environment(loader=file_loader)

async def render_sitemap_xml():
    #Обращение к базе данных
    lst_pages = await Page.filter(is_public=True) #тут на ваше усмотрение

    tm = env.get_template('sitemap.xml')
    msg = tm.render(pages=lst_pages)

    #возвращает содержимое файла
    return msg



class SiteMapView(HTTPMethodView):

    async def get(self, request):
        xml_content = await render_sitemap_xml()
        return text(xml_content, headers={'Content-Type': 'text/xml'})