Sitemap是为了方便搜索引擎识别网站上有哪些内容可供抓取的一个网页。最简单的的sitemap形式是XML文件,文件中会包含诸如网站上指定内容的网址以及其他相关的元数据(比如上次更新时间、内容更改的频率以及对应内容在网站自身的权重等等),这些可以方便搜索引擎更为智能地、有目的性地抓取我们网站的内容。
那么这个sitemap是怎么来的呢?如何为自己的网站添加sitemap呢?兄弟们别慌,对于Django这种非常成熟框架来说,很显然,这种功能肯定是内置的啦,是不是很开心?反正对我这种小白来说是很开心的,下面我们就来看看(我这种小白是如何被虐的)如何使用Django的内置sitemap。
安装
看到官方文档sitemap页面前几行的时候我就笑了,感觉so easy,妈妈再也不用担心我的站点没有sitemap了。
跟django的其他应用一毛一样,sitemap安装非常简单,咱们跟着官方文档来哈:
到settings.py文件中去添加'django.contrib.sitemaps'到INSTALLED_APPS;
确认一下在setting.py中的TEMPLATES下的APP_DIRS是否为True(已知Django 2.1是默认为True的);
确认一下已经安装了sites framework。看到这里不禁扶额,这是啥?我是谁?我在哪?……只能顺手挤按了一下睛明穴,不慌不慌,我们点进去看看这是个啥:
官方文档:Django comes with an optional “sites” framework. It’s a hook for associating objects and functionality to particular websites, and it’s a holding place for the domain names and “verbose” names of your Django-powered sites.
我的理解:这玩意是个钩子,连接objects和functionality的钩子;同时又是网站域名信息的存放地;大概就是这样吧;
既然sitemap需要这玩意,那就装吧,找到sites framework的Enabling the site framework,嘿嘿嘿,也非常简单,三步走战略:
添加'django.contrib.sites'到 INSTALLED_APPS(基本操作嘛);
在setting.py中设置SITE_ID: SITE_ID = 1;
Run migrate;(这里埋了个小坑,因为在migrate以后django.contrib.sites通过post_migrate创建并存储的网站的域名是example.com,而官方文档给出的如果想要设置正确的域名信息的话请用data migration,这里先按下不表,因为我当时就是这样没管它……)
好,通过以上三步,成功enable了site framework,那么前面说的sitemap安装的那三步也刚好完成了, Exciting!接下来就是设置sitemap的访问地址了(都这个套路嘛对吧)。
配置URL
我前前后后仔细阅读了两遍官方文档的介绍sitemap内容,发现django在这方面给出的可定制化内容还是挺多的,但是像我这种小白,或者说是对于简单的站点来说,其实没必要整的太复杂,请直接拿最简单的方式砸我脸上,是的,良心django再次提供了shortcuts——class GenericSitemap:
比如说你想把blog的所有Post列入到sitemap中以方便搜索引擎匹配,那么在urls.py中增加如下内容:
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from blog.models import Post
info_dict = {
'queryset': Post.objects.all(),
'date_field': 'pub_date',}
Sitemaps = {'blog': GenericSitemap(info_dict, priority=0.6)}
urlpatterns = [
# the sitemap
path('sitemap.xml', sitemap,
{'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),]
这时候访问你的域名/sitemap.xml即可看到django为你生成的sitemap文件了。也正是在这个时候前面埋的那个小坑出现了,你会发现sitemap中的域名怎么都成了example.com呢(在搜索该问题过程中发现有的同学会是localhost.com,可能是django版本不同吧)。这样的sitemap有个卵用哦……
没办法,我就回到site framework那里,硬着头皮再去看如何用data migration来设置正确的域名信息,因为官方文档就是这么说的:
django.contrib.sites
registers apost_migrate
signal handler which creates a default site namedexample.com
with the domainexample.com
. This site will also be created after Django creates the test database. To set the correct name and domain for your project, you can use a data migration.
结果看了半天,data migration的基本内容是明白了,但是还是没搞懂怎么通过它来设置域名信息(是小白没错了)。
于是放弃了,直接祭出Google大法,搜了一通发现原来如此,原来如此啊……
其实说白了,之所以生成的sitemap里的域名为example.com就是因为数据库里就是这个保存的,而这又是因为site framework那一步migrate在初始化的时候就是这么给数据库传递的默认值。既然想改这个值,无非就是去数据库里改数据罢了,那么改数据库内容最简单的方法是啥呢?当然是admin页面啦。想到这里,我直接访问/admin页面,登陆超级用户后发现,阿西吧,连自己去把对应内容注册到admin都省了,人家直接给你admin里已经默认显示在那了,跟默认的那个“用户USER”和“组GROUP”一样。
你要做的只是点开修改,把example.com改成你自己的域名即可。然后你再去看/sitemap.xml生成的已经是你要的域名了。
P.S. 我这里admin是中文界面是因为在settings.py中把language改成“zh_hans”了
至此,简单的Django sitemap生成就完成了,剩下的就是把你的sitemap提交给Google大大和Baidu小小了。这里说的只是比较简单的方法,如果你想实现一些复杂的sitemap,还是建议去啃一遍官方文档,虽然啃的慢,但是啃完了才会发现,真香!