Работа с файлом 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'})