登录        注册
本站基于Django开发,源码 Github 欢迎 Fork、Star。由于站点升级导致评论区留言信息丢失,欢迎前来发表新的评论

Django个人博客开发十五 | 网站地图

Django stormsha 6169浏览 323喜欢 0评论
本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier

网站地图是根据网站的结构、框架、内容,生成的导航网页,是一个网站所有链接的容器。很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎或者网络蜘蛛抓取网站页面,了解网站的架构,为网络蜘蛛指路,增加网站内容页面的收录概率。网站地图一般存放在域名根目录下并命名为sitemap,比如 http://stormsha.com/sitemap.xml

如果使用软件生成sitemap,在网站增加或者删除内容后,如果需要更新sitemap则只能重新扫描站点,生成新的xml文件,费时又费劲。而在 Django 中这一切变的很简单,自带 sitemap 地图应用,可以为站点创建一个完全可定制的、适时更新的站点地图。使用也非常的简单。

Django文档

1、添加sitemap地图应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 网站地图应用
    'django.contrib.sitemaps',
    'storm',
    'user',
    'comment',
]

2、定制地图成员

blog -> storm 添加 sitemaps.py 文件

blog -> storm -> sitemaps.py

# -*- coding: utf-8 -*-
from django.contrib.sitemaps import Sitemap
from .models import Article, Category, Tag
from django.db.models.aggregates import Count


# 文章聚类
class ArticleSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 1.0

    def items(self):
        return Article.objects.all()

    def lastmod(self, obj):
        return obj.update_date


# 分类聚类
class CategorySitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.8

    def items(self):
        return Category.objects.annotate(total_num=Count('article')).filter(total_num__gt=0)

    def lastmod(self, obj):
        return obj.article_set.first().create_date


# 标签聚类
class TagSitemap(Sitemap):
    changefreq = 'weekly'
    priority = 0.8

    def items(self):
        return Tag.objects.annotate(total_num=Count('article')).filter(total_num__gt=0)

    def lastmod(self, obj):
        return obj.article_set.first().create_date

这里从 Sitemap 类继承一个类,实现 items 方法,该方法返回所有要加入 Sitemap 的数据,属性changefreq、priority 和方法 location、lastmod 分别对应 Sitemap 标准 xml 文档中的相应字段。

changfreq:取值范围为:always、hourly、daily、weekly、monthly、yearly、never,可根据实际情况进行设置

priority:取值范围为0.4-1.0,如果不设置则默认值为0.5

location:用于定制地图项的url。如果不实现该方法,则必须实现地图对应model的get_absolute_url方法,实现该方法后则会优先采用该方法返回的url:

def location(self, obj): 
    return /tag/%s/ % obj.name

要增加多个地图成员,继承多个Sitemap,分别实现即可。

如果未提供location,框架将调用items()返回的每个对象上的get_absolute_url()方法。

该属性最终反映到HTML页面上的标签。

3、配置路由

blog -> blog -> urls.py

from django.contrib.sitemaps.views import sitemap
from storm.sitemaps import ArticleSitemap, CategorySitemap, TagSitemap

# 网站地图
sitemaps = {
    'articles': ArticleSitemap,
    'tags': TagSitemap,
    'categories': CategorySitemap
}

# 网站地图
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},name='django.contrib.sitemaps.views.sitemap'),  

推荐阅读:用django的sitemap框架实现站点地图  网站地图sitemap

4、添加网站地图

blog -> templates -> base.html

<div class="footer-inner">
    <div class="copyright pull-left">
        <a href="/" title="静觅">StormSha</a> 版权所有丨采用
        <a href="http://yusi123.com/"> 欲思 </a>主题丨
        <a href="https://www.djangoproject.com/" title="Django" target="_blank">基于Django构建</a>© 2019丨托管于
        <a rel="nofollow" target="_blank" href="https://www.aliyun.com/" title="阿里云主机" target="_blank">阿里云主机</a> &
        <a rel="nofollow" target="_blank" href="https://www.qiniu.com/">七牛云存储 </a><a href="/sitemap.xml" title="Sitemap" target="_blank">Sitemap</a>
        <div>
            <script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276375952'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s96.cnzz.com/z_stat.php%3Fid%3D1276375952%26online%3D1' type='text/javascript'%3E%3C/script%3E"));</script>
        </div>
    </div>

在页脚添加如下代码即可

    <a href="/sitemap.xml" title="Sitemap" target="_blank">Sitemap</a>

5、效果图

20381

【友情提示】——如果发现有表达错误,或者知识点错误,或者搞不懂的地方,请及时留言,可以在评论区互相帮助,让后来者少走弯路是我的初衷。我也是一步步摸着石头走过来的,深知网络上只言片语的图文教程,给初学者带来的深深困扰。

【建议】——在对项目结构不太熟悉时,参照完整源码少走弯路

转载请注明: StormSha » Django个人博客开发十五 | 网站地图

发表我的评论

表情
(0)个小伙伴在吐槽|0条评论
暂时没有评论,欢迎来尬聊!