Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。
在settings.py文件中安装应用并将SITE_ID = 1
INSTALLED_APPS = [
'django.contrib.sites',
'django.contrib.sitemaps',
]
SITE_ID = 1 # site表的pk值
执行makemigration和migrate进行数据库迁移
执行后去django的admin中修改样例的domain和displaywww.example.com为你的域名
www.site.com
在你的app文件夹下添加sitemap.py文件
from django.contrib.sitemaps import Sitemap
from blog.models import Article, Category, Tag, UserInfo
from django.urls import reverse
# 静态网页路径配置
class StaticViewSitemap(Sitemap):
priority = 0.5 # 优先级
changefreq = 'daily' # 更新频率
def items(self):
# 静态网页的别名解析
return ['index', 'friends', 'about', 'archive', 'messages']
def location(self, item):
# 解析item中的列表
return reverse(item)
# 动态页面url
class ArticleSiteMap(Sitemap):
changefreq = "Weekly"
priority = "0.6"
def items(self):
# 所有的文章对应的url
# 需要在你的model中实现get_absolute_url方法
return Article.objects.all()
def lastmod(self, obj):
# 返回一个时间datetime对象
# 加入你的model没有时间字段,可以不写
return obj.update_time
class CategorySiteMap(Sitemap):
changefreq = "Weekly"
priority = "0.6"
def items(self):
# 需要在你的model中实现get_absolute_url方法
return Category.objects.all()
# 无时间字段不写
# def lastmod(self, obj):
# return obj.last_mod_time
class TagSiteMap(Sitemap):
changefreq = "Weekly"
priority = "0.3"
def items(self):
# 需要在你的model中实现get_absolute_url方法
return Tag.objects.all()
需要注意的一点就是必须在你的model中实现get_absolute_url方法
比如我的三个model
class Article(models.Model):
"""
文章
"""
title = models.CharField(max_length=50, verbose_name='文章标题')
en_us = models.CharField(max_length=50, blank=True, null=True, verbose_name='英文标题')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
# 省略
def get_absolute_url(self):
# 要导入reverse
# from django.urls import reverse
# detail是别名,kwargs是url解析传入的参数
# 因为动态页面url需要传入参数
# 文章详情url,有名分组,无名分组的话不需要指定名称
# re_path(r'^articles/detail/(?P<en_us>.*)/', views.ArticleView.as_view(), name='detail'),
return reverse('detail', kwargs={'en_us': self.en_us})
class Meta:
verbose_name = '文章'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
# 其余两个模型同理
配置url路由
from django.contrib.sitemaps.views import sitemap
from blog.sitemap import StaticViewSitemap, ArticleSiteMap, CategorySiteMap, TagSiteMap
# sitemap
re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),