Django 给站点增加sitemap.xml 对搜索引擎更加友好
Django 开发站点的时候,一般都会说给站点最好增加sitemap.xml,这样方便搜索引擎抓取和识别。
首先不用太担心,即使你是一个Django新手,跟着我的方法来也肯定是可以的。我会说的细致一些。
认知
一般来说sitemap主要是为了给站点经常更新或发布的资源类似增加了一个索引,方便搜索引擎快速的知道我们更新了什么内容,从而进行抓取。
Django的准备工作
先在项目的settings中引入'django.contrib.sites'、'django.contrib.sitemaps'这2个中间件。同时增加一个配置SITE_ID = 1,接下来就开始同步一下数据库。Django会自动同步并生成2个表。这些基本都是固定的,没有什么需要我们设置的。
开发工作
其实与其说是开发工作,也相当于是按部就班的照着写就可以了。
先在项目中创建一个sitemap.py文件。
* 假设我想将网站的新闻同步到sitemap.xml中
# sitemap.py
from django.contrib.sitemaps import Sitemap
from models import NewsModels # NewsModels 是我自己创建的新闻类
class NewsSiteMap(Sitemap):
changefreq = 'weekly'
priority = 0.9
def items(self):
return news_models.NewsModels.objects.all()
def lastmod(self,obj):
return obj.update_time
我的新闻数据库表如下
# models.py
class NewsModels(models.Model):
title = models.CharField(max_length=100,verbose_name='新闻标题')
ification = models.ForeignKey(NewsClassification, on_delete=models.CASCADE, verbose_name='新闻分类', db_index=True)
desc = models.CharField(max_length=180, verbose_name='新闻描述', help_text='用于SEO相关')
tags = models.CharField(max_length=120,verbose_name='文章关键词',null=True,blank=True,help_text='新闻关键词SEO相关')
create_time = models.DateTimeField(verbose_name='发布时间', auto_now_add=True)
update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)
content = models.TextField(verbose_name='新闻内容')
looks = models.BigIntegerField(default=0,verbose_name='浏览次数')
create_user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='发布人')
is_news = models.BooleanField(default=True,verbose_name='是否新闻',help_text='选择为否的话可以不在新闻列表,需要用链接引用')
push_date = models.DateTimeField(verbose_name='提交日期',null=True,blank=True)
def __str__(self):
return self.title
class Meta:
verbose_name = '新闻明细'
ordering = ('-id',)
def get_absolute_url(self):
return 'news-info/' + str(self.id) + '/'
这里主要注意一下,在models的模型类下面要增加一个get_absolute_url,它是用来生成sitemap.xml中的url的。具体要根据你页面的url规则设置一下。
URL配置
这一步也比较简单
# urls.py
from django.contrib.sitemaps.views import sitemap # 网站地图
from web import sitemaps # 新闻的网站地图
sitemaps = {
'news':sitemaps.NewsSiteMap,
}
urlpatterns = [
... # 原本你设置的urlpath
path('sitemap.xml',sitemap,{'sitemaps':sitemaps},name='django.contrib.sitemaps.views.sitemap'),
]
然后重启项目,正常情况就基本都OK了。
具体的一些释义问题
以上面的例子为主,这里主要讲一下 NewsSiteMap这个类的含义
首先sitemap中包含的种类比较多,但是我们主要用的其实就只要loc、lastmod、changefreq、priority
具体的释义如下
| 代码 | 解释 |
|---|---|
| urlset | 定义.xml的命名空间 |
| url | 具体某个链接地址 |
| loc | 页面永久链接地址 |
| lastmod | 页面最后修改时间 |
| changefreq | 页面内容更新频率 |
| priority | 重要性 0~1 |
changefreq
| 可用值 | 解释 |
|---|---|
| always | 经常 |
| hourly | 小时为单位更新 |
| daily | 天为单位更新 |
| weekly | 周为单位更新 |
| monthly | 月为单位更新 |
| yearly | 年为单位更新 |
- 首页就可以使用
always,很久不更新的 就可以使用yearly,这块具体的逻辑如果需要的话,就要自己在完善类。
priority
设置页面的权重值比例,取值范围是 0.0~1.0之间,值越大,表示此链接的优先级越高。
可能会出现的错误
如果不是代码的问题,请先不要着急,优先登陆一下admin管理后台,然后在里面多了一个站点,请确认一下是否有内容,如果没有内容的话,请添加添加一下站点名称和地址,然后在看看。