站点地图
站点地图是网站上的一个XML文件,它会告知搜索引擎网站的更改频率以及页面的重要性。要创建站点地图,只需编写Sitemap类并在URLconf中指向它。
要开启sitemap需要:
- 添加
django.contrib.sitemaps
到INSTALLED__APPS
; - 在
TEMPLATES
中,需要包含DjangoTemplates
后端,而且APP_DIRS
要为True; - 确定已经安装了 sites 框架.
在urls.py中添加sitemap到URLconf中:
sitemaps = {
'Topic': TopicSitemap,
}
urlpatterns = i18n_patterns(
path(r'^i18n/', include('django.conf.urls.i18n')),
path('admin/', admin.site.urls),
path('', include('learning_logs.urls', namespace='learning_logs')),
path('users/', include('users.urls', namespace='users')),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
)+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
sitemap文件的名字无关紧要,但是它在服务器上的位置却很重要。搜索引擎只索引你的sitemap中当前URL级别及其以下级别的链接。用一个实例来说,如果 sitemap.xml位于你的根目录
,那么它将引用任何的URL。然而,如果你的sitemap位于 /content/sitemap.xml
,那么它只引用以/content/
打头的URL。
sitemap的视图需要一个额外的参数{'sitemaps': sitemaps}
,sitemaps
是一个字典表,格式为{标签:映射的Sitemap类或其实例}
。
Sitemap类
创建一个 sitemaps.py ,添加自定义的Sitemap类:
from django.contrib.sitemaps import Sitemap
from learning_logs.models import Topic, Post
class TopicSitemap(Sitemap):
# the change frequency of every object returned by items().
changefreq = 'daily'
priority = 0.5
# 必须添加 提供对象列表。
# 框架并不关心对象的类型,唯一关心的是这些对象。
def items(self):
return Topic.objects.all().filter()
# 对象的最后修改日期
def lastmod(self, obj):
return obj.date_added
# 给定对象的绝对URL。 绝对URL不包含协议名称和域名。
# 如果没有提供 location , 框架将会在每个 items() 返回的对象上调用 get_absolute_url() 方法
def location(self, obj):
return f'/topic/{obj.id}'
一个Sitemap类有如下的方法和属性:
items
:必须添加的方法,返回一系列对象。框架并不关心对象的具体类型,唯一关心的是这些对象提供给其他方法或属性调用。location
:可以方法也可以是属性。返回给定对象的绝对URL。绝对URL不包含协议名称和域名:如'/foo/bar/'
, 如果没有提供 location , 框架将会在每个items()返回的对象上调用get_absolute_url()
方法lastmod
: 对象的最后修改日期,是一个datetime
对象;changefreq
:代表对象变更的频率,可以选的值有:'always'
、hourly
、daily
和'never'
等priority
: 取值范围在 0.0 和 1.0 之间,用来表明优先级,默认0.5,具体查看sitemap的官方说明;protocol
:URL中使用的协议名https
或http
(默认);limit
:每页显示的URL数量,默认每页50000;i18n
:是否使用自定义的LANGUAGE
来显示,默认False;
快捷方式创建sitemap
通过GenericSitemap
类可以快速创建sitemap,
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from blog.models import Entry
info_dict = {
'queryset': Entry.objects.all(),
'date_field': 'pub_date',
}
urlpatterns = [
# some generic view using info_dict
# ...
# the sitemap
path('sitemap.xml', sitemap,
{'sitemaps': {'blog': GenericSitemap(info_dict, priority=0.6)}},
name='django.contrib.sitemaps.views.sitemap'),
]
静态视图的sitemap
通常,您希望搜索引擎抓取工具索引既不是对象的详细信息页,也不是平面页的视图。 解决方案是在项目中明确列出这些视图的URL名称,并在站点地图的location
方法中调用reverse()
。 例如:
# sitemaps.py
from django.contrib import sitemaps
from django.urls import reverse
class StaticViewSitemap(sitemaps.Sitemap):
priority = 0.5
changefreq = 'daily'
def items(self):
return ['main', 'about', 'license']
def location(self, item):
return reverse(item)
# urls.py
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from .sitemaps import StaticViewSitemap
from . import views
sitemaps = {
'static': StaticViewSitemap,
}
urlpatterns = [
path('', views.main, name='main'),
path('about/', views.about, name='about'),
path('license/', views.license, name='license'),
# ...
path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap')
]
Sitemap索引
sitemap框架同样可以根据 sitemaps 字典中定义的单独的sitemap文件来建立索引,它与其他sitemap的区别就在与sitemap.views.index()
和sitemap.view.sitemap()
:
from django.contrib.sitemaps import views
urlpatterns = [
path('sitemap.xml', views.index, {'sitemaps': sitemaps}),
path('sitemap-<section>.xml', views.sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),
]
在这里sitemap
需要接收一个section
关键字。这将自动生成一个 sitemap.xml 文件, 它同时引用 sitemap-flatpages.xml 和 sitemap-blog.xml . Sitemap 类,而 sitemaps 目录根本没有更改。当站点的URL数量超过5000时,就应该创建一个索引,这样的话,Django会自动给sitemap进行分页。