|
|
|
|
@ -1,59 +1,88 @@
|
|
|
|
|
# 导入 Django 内置站点地图基类:用于快速实现标准化 sitemap.xml
|
|
|
|
|
from django.contrib.sitemaps import Sitemap
|
|
|
|
|
# 导入 URL 反向解析工具:生成页面的绝对 URL(适配路由命名)
|
|
|
|
|
from django.urls import reverse
|
|
|
|
|
|
|
|
|
|
# 导入博客核心模型:用于生成动态内容(文章、分类、标签)的站点地图
|
|
|
|
|
from blog.models import Article, Category, Tag
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 静态页面站点地图类:处理无数据库关联的静态页面(如博客首页)
|
|
|
|
|
class StaticViewSitemap(Sitemap):
|
|
|
|
|
# 优先级:0.5(取值 0.0-1.0,值越高搜索引擎越优先抓取,静态页优先级中等)
|
|
|
|
|
priority = 0.5
|
|
|
|
|
# 更新频率:daily(每天更新,适合内容相对稳定但可能微调的静态页)
|
|
|
|
|
changefreq = 'daily'
|
|
|
|
|
|
|
|
|
|
# 定义要包含的静态页面:返回路由名称列表(对应 urls.py 中命名的路由)
|
|
|
|
|
def items(self):
|
|
|
|
|
return ['blog:index', ]
|
|
|
|
|
return ['blog:index', ] # 此处仅包含博客首页(路由名为 'blog:index')
|
|
|
|
|
|
|
|
|
|
# 生成静态页面的 URL:通过路由名称反向解析为绝对路径
|
|
|
|
|
def location(self, item):
|
|
|
|
|
return reverse(item)
|
|
|
|
|
return reverse(item) # item 为 items() 返回的路由名称,如 'blog:index'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 文章站点地图类:处理博客文章的动态页面(核心内容,SEO 关键)
|
|
|
|
|
class ArticleSiteMap(Sitemap):
|
|
|
|
|
# 更新频率:monthly(每月更新,适合文章发布后较少修改的场景)
|
|
|
|
|
changefreq = "monthly"
|
|
|
|
|
# 优先级:0.6(高于静态页和分类/标签,文章是站点核心内容,优先抓取)
|
|
|
|
|
priority = "0.6"
|
|
|
|
|
|
|
|
|
|
# 定义要包含的文章:仅筛选“已发布”状态的文章(排除草稿、私有文章)
|
|
|
|
|
def items(self):
|
|
|
|
|
return Article.objects.filter(status='p')
|
|
|
|
|
|
|
|
|
|
# 文章最后更新时间:用于搜索引擎判断内容是否更新,提升抓取效率
|
|
|
|
|
def lastmod(self, obj):
|
|
|
|
|
return obj.last_modify_time
|
|
|
|
|
return obj.last_modify_time # 引用文章模型的“最后修改时间”字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 分类站点地图类:处理文章分类页面(聚合类内容,辅助 SEO)
|
|
|
|
|
class CategorySiteMap(Sitemap):
|
|
|
|
|
# 更新频率:Weekly(每周更新,分类内容更新频率低于文章)
|
|
|
|
|
changefreq = "Weekly"
|
|
|
|
|
# 优先级:0.6(与文章同级,分类页是重要的内容聚合入口)
|
|
|
|
|
priority = "0.6"
|
|
|
|
|
|
|
|
|
|
# 定义要包含的分类:获取所有分类(无论是否有文章,确保分类页被收录)
|
|
|
|
|
def items(self):
|
|
|
|
|
return Category.objects.all()
|
|
|
|
|
|
|
|
|
|
# 分类最后更新时间:判断分类下内容是否有变化(如新增/修改文章)
|
|
|
|
|
def lastmod(self, obj):
|
|
|
|
|
return obj.last_modify_time
|
|
|
|
|
return obj.last_modify_time # 引用分类模型的“最后修改时间”字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 标签站点地图类:处理文章标签页面(细分内容聚合,补充 SEO 覆盖)
|
|
|
|
|
class TagSiteMap(Sitemap):
|
|
|
|
|
# 更新频率:Weekly(每周更新,标签内容更新频率与分类一致)
|
|
|
|
|
changefreq = "Weekly"
|
|
|
|
|
# 优先级:0.3(低于文章和分类,标签页是辅助导航入口,优先级较低)
|
|
|
|
|
priority = "0.3"
|
|
|
|
|
|
|
|
|
|
# 定义要包含的标签:获取所有标签(确保所有标签页被搜索引擎收录)
|
|
|
|
|
def items(self):
|
|
|
|
|
return Tag.objects.all()
|
|
|
|
|
|
|
|
|
|
# 标签最后更新时间:判断标签下内容是否有变化
|
|
|
|
|
def lastmod(self, obj):
|
|
|
|
|
return obj.last_modify_time
|
|
|
|
|
return obj.last_modify_time # 引用标签模型的“最后修改时间”字段
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 用户站点地图类:处理文章作者页面(展示用户发布的所有文章,提升作者页曝光)
|
|
|
|
|
class UserSiteMap(Sitemap):
|
|
|
|
|
# 更新频率:Weekly(每周更新,用户发布文章频率通常较低)
|
|
|
|
|
changefreq = "Weekly"
|
|
|
|
|
# 优先级:0.3(与标签同级,作者页是辅助内容入口)
|
|
|
|
|
priority = "0.3"
|
|
|
|
|
|
|
|
|
|
# 定义要包含的用户:获取所有发布过文章的作者(去重,避免重复收录同一用户)
|
|
|
|
|
def items(self):
|
|
|
|
|
# 1. 从所有文章中提取作者字段 → 2. 转集合去重 → 3. 转列表返回
|
|
|
|
|
return list(set(map(lambda x: x.author, Article.objects.all())))
|
|
|
|
|
|
|
|
|
|
# 用户页面最后更新时间:用用户“注册时间”替代(简化逻辑,也可改为用户最新文章发布时间)
|
|
|
|
|
def lastmod(self, obj):
|
|
|
|
|
return obj.date_joined
|
|
|
|
|
return obj.date_joined # 引用用户模型的“注册时间”字段
|