不忘初心,
牢记使命。

Django给博客添加sitemap

2021-04-07 大聪明 0评论 215 0喜欢

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'),

发表评论 取消回复

电子邮件地址不会被公开。

请输入正确格式的qq邮箱
请输入以http或https开头的URL,格式如:https://libo_sober.top