Django站点Sitemap生成及修改默认域名信息

Sitemap是为了方便搜索引擎识别网站上有哪些内容可供抓取的一个网页。最简单的的sitemap形式是XML文件,文件中会包含诸如网站上指定内容的网址以及其他相关的元数据(比如上次更新时间、内容更改的频率以及对应内容在网站自身的权重等等),这些可以方便搜索引擎更为智能地、有目的性地抓取我们网站的内容。

那么这个sitemap是怎么来的呢?如何为自己的网站添加sitemap呢?兄弟们别慌,对于Django这种非常成熟框架来说,很显然,这种功能肯定是内置的啦,是不是很开心?反正对我这种小白来说是很开心的,下面我们就来看看(我这种小白是如何被虐的)如何使用Django的内置sitemap。

安装

看到官方文档sitemap页面前几行的时候我就笑了,感觉so easy,妈妈再也不用担心我的站点没有sitemap了。

跟django的其他应用一毛一样,sitemap安装非常简单,咱们跟着官方文档来哈:

  1. 到settings.py文件中去添加'django.contrib.sitemaps'到INSTALLED_APPS;

  2. 确认一下在setting.py中的TEMPLATES下的APP_DIRS是否为True(已知Django 2.1是默认为True的);

  3. 确认一下已经安装了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,嘿嘿嘿,也非常简单,三步走战略:

  1. 添加'django.contrib.sites'到 INSTALLED_APPS(基本操作嘛);

  2. 在setting.py中设置SITE_ID: SITE_ID = 1;

  3. 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 a post_migrate signal handler which creates a default site named example.com with the domain example.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”一样。

admin页面的站点修改界面

你要做的只是点开修改,把example.com改成你自己的域名即可。然后你再去看/sitemap.xml生成的已经是你要的域名了。

P.S. 我这里admin是中文界面是因为在settings.py中把language改成“zh_hans”了

至此,简单的Django sitemap生成就完成了,剩下的就是把你的sitemap提交给Google大大和Baidu小小了。这里说的只是比较简单的方法,如果你想实现一些复杂的sitemap,还是建议去啃一遍官方文档,虽然啃的慢,但是啃完了才会发现,真香!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容