YOLO813

django制作站点地图sitemap(1)

    网站地图就是sitemap,是一个网站所有链接的容器。很多网站的链接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎蜘蛛抓取网站页面,通过抓取网站页面,可以清晰地了解网站的架构。网站地图一般存放在根目录下,并命名为sitemap,为搜索引擎蜘蛛指路,增加网站重要内容页面的收录,我们只要知道制作了sitemap之后提交给搜索引擎,可以得到更快的收录就可以了。

    首先在配置文件INSTALLED_APPS中增加django.contrib.sitemaps,并确认DjangoTemplates已经打开。


    在根URLconf输入以下代码激活sitemap生成器

from django.contrib.sitemaps.views import sitemap
path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
     name='django.contrib.sitemaps.views.sitemap')

在选择保存之后,你会发现django报错了,很正常,因为我们还没有定义值sitemaps,现在是无法找到的;这个路径sitemap.xml并非强制性要求,可以自定义,但是自定义名称不要太长,如果在生产环境下发现站点地图404,可以尝试将其路径命名为sitemap.xml,再来打开试试,因为在测试环境下这个没有发生错误,所以一开始没有往这方面去思考,这可真是个大坑,目前还没有找到原因。

    激活了之后,我们可以开始生成站点地图了,主要有两种站点地图,一种是静态,一种是动态。静态就是我们平时所见的网站首页,列表页这种路径基本不会改变的页面,动态页面就类似于文章详情页这种经常变动(或者说路径参数是变量生成的)的页面。

    我们在根URLconf同目录下,新建文件sitemaps.py,输入以下代码,

#sitemaps.py
from django.contrib import sitemaps
from django.urls import reverse
from Nba.models import nba
#静态
class StaticViewSitemap(sitemaps.Sitemap):
    priority=0.5
    changefreq = "daily"
    def items(self):
        return ['index',"nba:search"]
    def location(self, item):
        return reverse(item)
# 动态
class DynamicSitemap(sitemaps.Sitemap):
    changefreq = "daily"
    priority = 0.7
    def items(self):
        return nba.objects.all()
    # def location(self, obj):
    #     return obj.nba_full_path
    def location(self, obj):
        return "/nba/name/"+obj.number
    def lastmod(self, obj):
        return obj.update_time

    上面代码中,第三行导入了模型,往下建立了一个StaticViewSitemap类,专门用于建立静态页面站点地图,在items函数中返回所有静态页面的命名空间(格式还是app_name:name),在location函数中利用reverse函数反转,获取对应的链接。

    再往下,我新建了DynamicSitemap类,用于返回动态页面的站点地图,items函数中返回模型的所有数据,可以看到我注释了一个location函数,因为官网没有着重介绍这个函数,我着实踩了些坑,这里面的obj对象其实就是我们导入的nba模型,也就是说这个函数可以有两种写法,一种是我注释的这种方法,前提是你导入的模型中存在nba_full_path这个属性;另外一种就是在location函数中利用拼接的方法返回正确的路径,还有第三种方法吗?有的,我们把这个location函数完全注释掉,然后打开自己建立模型的models.py文件,在模型类里面添加一个get_absolute_url函数,也是可以的。


    我们再次回到根URLconf文件,在里面添加如下代码,这个时候再次保存就不会报错了,而且访问http://127.0.0.1:8000/sitemap.xml可以看见站点地图的存在了:

from.sitemaps import StaticViewSitemap,DynamicSitemap
sitemaps = {
    'dynamic':DynamicSitemap,
    'static': StaticViewSitemap,
}


    当然,这个里面还是存在一些问题的,例如sitemap一次性不能提交超过50000条,不能大于50M,如果确实数据量太大,那么就必须创建索引(sitemap index)来进行提交,将所有有关站点地图信息封装到sitemapindex中,以下内容摘录于sitemaps.org,例如:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <sitemap>
      <loc>http://www.example.com/sitemap1.xml.gz</loc>
      <lastmod>2004-10-01T18:23:17+00:00</lastmod>
   </sitemap>
   <sitemap>
      <loc>http://www.example.com/sitemap2.xml.gz</loc>
      <lastmod>2005-01-01</lastmod>
   </sitemap>
</sitemapindex>


    后面再进行补充。


参考:

# django生成sitemap
https://docs.djangoproject.com/en/3.1/ref/contrib/sitemaps/
# sitemaps
https://www.sitemaps.org/protocol.html