站点地图是您网站上的一个XML文件,它告诉搜索引擎索引器您的网页更改频率以及某些网页与您网站上其他网页相关的“重要”程度。此信息有助于搜索引擎索引您的网站。
具体生成方法如下:
1、添加'django.contrib.sitemaps'
到 settings.py 中的INSTALLED_APPS
。
2、确保您的TEMPLATES
设置包含DjangoTemplates
其APP_DIRS
选项设置为的后端True
。(默认存在)
3、创建 sitemap.py ( 以下根据自己模型自行修改 )
from django.contrib.sitemaps import Sitemap from blog.models import Article, Category, Tag class ArticleSiteMap(Sitemap): changefreq = "monthly" priority = "0.6" def items(self): return Article.objects.all() def lastmod(self, obj): return obj.created_time class CategorySiteMap(Sitemap): changefreq = "Weekly" priority = "0.6" def items(self): return Category.objects.all() class TagSiteMap(Sitemap): changefreq = "Weekly" priority = "0.3" def items(self): return Tag.objects.all()
模型中增加(url 根据自己 urls.py 设定的返回,Article、Category、Tag 都要增加)
def get_absolute_url(self): return '/show-%s.html' % (self.id)
Sitemap
类引用¶
Sitemap
类可以定义下列方法/属性:i18n
¶可选的。
一个布尔属性,用于定义是否应使用您的所有URL生成此站点地图的URL
LANGUAGES
。默认是False
。limit
¶可选的。
此属性定义站点地图的每个页面上包含的最大URL数。其值不应超过默认值
50000
,即Sitemaps协议中允许的上限。protocol
¶可选的。
此属性定义站点地图中URL 的协议(
'http'
或'https'
)。如果未设置,则使用请求站点地图的协议。如果站点地图是在请求的上下文之外构建的,则默认为'http'
。priority
¶可选的。方法或属性。
如果它是一个方法,它应该采用一个参数 - 一个返回的对象
items()
- 并将该对象的优先级作为字符串或浮点数返回。如果它是一个属性,则其值应为字符串或float,表示返回的每个对象 的优先级
items()
。示例值
priority
:0.4
,1.0
。页面的默认优先级是0.5
。有关更多信息,请参阅sitemaps.org文档。'always'
'hourly'
'daily'
'weekly'
'monthly'
'yearly'
'never'
changefreq
¶可选的。方法或属性。
如果它是一个方法,它应该采用一个参数 - 一个返回的对象
items()
- 并将该对象的更改频率作为字符串返回。如果它是一个属性,则其值应该是一个字符串,表示返回的每个对象的更改频率
items()
。changefreq
无论您使用方法还是属性,可能的值是:lastmod
¶可选的。方法或属性。
如果它是一个方法,它应该采用一个参数 - 一个返回的对象
items()
- 并返回该对象的最后修改日期/时间作为datetime
。如果它是一个属性,则其值应该是
datetime
表示返回的每个对象 的最后修改日期/时间items()
。如果站点地图中的所有项目都具有a
lastmod
,则生成的站点地图views.sitemap()
将具有Last-Modified
等于最新的标题lastmod
。您可以激活ConditionalGetMiddleware
以使Django对具有If-Modified-Since
标题的请求做出适当响应,如果未更改,则会阻止发送站点地图。好:
'/foo/bar/'
坏:
'example.com/foo/bar/'
坏:
'https://example.com/foo/bar/'
可选的。方法或属性。
如果它是一个方法,它应该返回由返回的给定对象的绝对路径
items()
。如果它是一个属性,则其值应该是一个字符串,表示用于返回的每个对象 的绝对路径
items()
。在这两种情况下,“绝对路径”表示不包含协议或域的URL。例子:
如果
location
未提供,框架将get_absolute_url()
在返回的每个对象上调用该方法items()
。要指定除以外的协议
'http'
,请使用protocol
。需要。一种返回对象列表的方法。框架不关心它们是什么类型的对象; 即所有重要的是,这些对象获得通过的
location()
,lastmod()
,changefreq()
和priority()
方法。
4、urls.py 增加
from blog.sitemap import ArticleSiteMap, CategorySiteMap, TagSiteMap from django.contrib.sitemaps.views import sitemap sitemaps = { 'Article': ArticleSiteMap, 'Category': CategorySiteMap, 'Tag': TagSiteMap, }
urlpatterns = [ . . . path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap') ]
5、登录系统后台,然后在settings.py 中增加
INSTALLED_APPS = [ ... ... 'django.contrib.sites', ]
刷新页面
填写站点域名
(先登录后台再在 settings 增加 sites 否则报错。)
6、http://domain.om/sitemap.xml 验证是否正确。
可能遇到的问题:
object has no attribute 'get_absolute_url'
需要在models 对应的类中定义此方法,方法参考以上代码。
Comments (0)