本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier |
网站地图是根据网站的结构、框架、内容,生成的导航网页,是一个网站所有链接的容器。很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎或者网络蜘蛛抓取网站页面,了解网站的架构,为网络蜘蛛指路,增加网站内容页面的收录概率。网站地图一般存放在域名根目录下并命名为sitemap,比如 http://stormsha.com/sitemap.xml
如果使用软件生成sitemap,在网站增加或者删除内容后,如果需要更新sitemap则只能重新扫描站点,生成新的xml文件,费时又费劲。而在 Django 中这一切变的很简单,自带 sitemap 地图应用,可以为站点创建一个完全可定制的、适时更新的站点地图。使用也非常的简单。
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、效果图
【友情提示】——如果发现有表达错误,或者知识点错误,或者搞不懂的地方,请及时留言,可以在评论区互相帮助,让后来者少走弯路是我的初衷。我也是一步步摸着石头走过来的,深知网络上只言片语的图文教程,给初学者带来的深深困扰。
【建议】——在对项目结构不太熟悉时,参照完整源码少走弯路
转载请注明: StormSha » Django个人博客开发十五 | 网站地图