Django学习19-站点地图

站点地图

  站点地图是网站上的一个XML文件,它会告知搜索引擎网站的更改频率以及页面的重要性。要创建站点地图,只需编写Sitemap类并在URLconf中指向它。
  要开启sitemap需要:

  • 添加django.contrib.sitemapsINSTALLED__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'hourlydaily'never'
  • priority : 取值范围在 0.0 和 1.0 之间,用来表明优先级,默认0.5,具体查看sitemap的官方说明;
  • protocol:URL中使用的协议名 httpshttp(默认);
  • 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进行分页。

猜你喜欢

转载自blog.csdn.net/qq_19268039/article/details/84141731