站点地图框架

Django附带了一个高级站点地图生成框架来创建 sitemap XML文件。

概述

站点地图是网站上的一个XML文件,它告诉搜索引擎索引器页面更改的频率以及某些页面与网站上其他页面的关系“重要程度”。此信息有助于搜索引擎索引您的网站。

Django Sitemap框架允许您用Python代码表示这些信息,从而自动创建此XML文件。

它很像姜戈的 syndication framework . 要创建站点地图,请编写 Sitemap 在你的 URLconf .

安装

要安装站点地图应用程序,请执行以下步骤:

  1. 添加 'django.contrib.sitemaps' 对你 INSTALLED_APPS 设置。

  2. 确定你的 TEMPLATES 设置包含 DjangoTemplates 后端谁的 APP_DIRS 选项设置为 True . 默认情况下它就在里面,所以如果你改变了设置,你只需要改变这个。

  3. 确保已安装 sites framework .

(注意:站点地图应用程序不安装任何数据库表。它需要进入的唯一原因 INSTALLED_APPS 就是这样 Loader() 模板加载器可以找到默认模板。)

初始化

views.sitemap(request, sitemaps, section=None, template_name='sitemap.xml', content_type='application/xml')

要激活Django站点上的站点地图生成,请将此行添加到 URLconf ::

from django.contrib.sitemaps.views import sitemap

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

这告诉Django在客户端访问时构建一个站点地图 /sitemap.xml .

站点 Mapfile 的名称并不重要,但位置是。搜索引擎将只为网站图中当前URL级别及以下的链接编制索引。例如,如果 sitemap.xml 位于根目录中,它可以引用站点中的任何URL。但是,如果您的站点地图位于 /content/sitemap.xml ,它只能引用以开头的URL /content/ .

Sitemap视图需要一个额外的必需参数: {{'sitemaps': sitemaps}} . sitemaps 应该是映射一个短节标签的字典(例如, blognewsSitemap 类(例如, BlogSitemapNewsSitemap )它也可以映射到 实例 A的 Sitemap 类(例如, BlogSitemap(some_var)

Sitemap

A Sitemap 类是一个表示站点地图中条目的“部分”的Python类。例如,一个 Sitemap 类可以表示博客的所有条目,而另一个类可以表示事件日历中的所有事件。

在最简单的情况下,所有这些部分集中在一起 sitemap.xml 但也可以使用框架生成引用单个站点 Mapfile 的站点地图索引,每个部分一个。(见 Creating a sitemap index 下面)

Sitemap 类必须子类 django.contrib.sitemaps.Sitemap . 它们可以生活在代码库的任何地方。

一个例子

假设你有一个博客系统, Entry 模型,您希望您的站点地图包含到您个人博客条目的所有链接。以下是您的站点地图类的外观:

from django.contrib.sitemaps import Sitemap
from blog.models import Entry


class BlogSitemap(Sitemap):
    changefreq = "never"
    priority = 0.5

    def items(self):
        return Entry.objects.filter(is_draft=False)

    def lastmod(self, obj):
        return obj.pub_date

注:

Sitemap 类引用

class Sitemap[源代码]

A Sitemap 类可以定义以下方法/属性:

items[源代码]

必修的。 返回 sequenceQuerySet 对象。框架不在乎什么 type 它们是对象;重要的是这些对象被传递到 location()lastmod()changefreq()priority() 方法。

location[源代码]

可选的。 方法或属性。

如果它是一个方法,它应该返回给定对象的绝对路径 items() .

如果它是一个属性,它的值应该是一个表示绝对路径的字符串 每一个 对象返回者 items() .

在这两种情况下,“绝对路径”是指不包括协议或域的URL。实例:

  • 好: '/foo/bar/'

  • 不好的: 'example.com/foo/bar/'

  • 不好的: 'https://example.com/foo/bar/'

如果 location 未提供,框架将调用 get_absolute_url() 返回的每个对象的方法 items() .

指定除 'http' 使用 protocol .

lastmod

可选的。 方法或属性。

如果它是一个方法,它应该接受一个参数——由返回的对象 items() --并将该对象的上次修改日期/时间作为 datetime .

如果它是一个属性,它的值应该是 datetime 表示上次修改的日期/时间 每一个 对象返回者 items() .

如果站点地图中的所有项目 lastmod ,生成的站点地图 views.sitemap() 将有一个 Last-Modified 标题等于最新 lastmod . 您可以激活 ConditionalGetMiddleware 使Django以 If-Modified-Since 标题,它将阻止发送未更改的站点地图。

paginator

Optional.

此属性返回一个 Paginatoritems() 。如果您在批处理中生成站点地图,您可能希望将其作为缓存属性来覆盖,以避免多次 items() 打电话。

changefreq

可选的。 方法或属性。

如果它是一个方法,它应该接受一个参数——由返回的对象 items() --并以字符串形式返回该对象的更改频率。

如果它是一个属性,它的值应该是一个字符串,表示 每一个 对象返回者 items() .

的可能值 changefreq ,无论您使用的是方法还是属性,都是:

  • 'always'

  • 'hourly'

  • 'daily'

  • 'weekly'

  • 'monthly'

  • 'yearly'

  • 'never'

priority

可选的。 方法或属性。

如果它是一个方法,它应该接受一个参数——由返回的对象 items() --并以字符串或浮点形式返回该对象的优先级。

如果它是一个属性,它的值应该是表示优先级的字符串或浮点 每一个 对象返回者 items() .

示例值 priority0.41.0 . 页面的默认优先级为 0.5 . 见 sitemaps.org documentation

protocol

Optional.

此属性定义协议 ('http''https' 站点地图中的URL。如果未设置,则使用请求站点地图时使用的协议。如果站点地图是在请求上下文之外构建的,则默认为 'https'

Changed in Django 5.0:

在旧版本中,在请求上下文之外构建的站点地图的默认协议是 'http'

limit

Optional.

此属性定义站点地图每页上包含的最大URL数。其值不应超过默认值 50000 ,这是 Sitemaps protocol .

i18n

Optional.

一个布尔属性,用于定义是否应使用 LANGUAGES . 默认值为 False .

languages

Optional.

A sequence 属于 language codes 用于在以下情况下生成备用链接 i18n 已启用。默认为 LANGUAGES .

alternates

Optional.

布尔属性。当与 i18n 生成的url每个都有一个指向其他语言版本的备用链接的列表 hreflang attribute . 默认值为 False .

x_default

Optional.

布尔属性。什么时候? True 由生成的备用链接 alternates 将包含 hreflang="x-default" 值为的回退条目 LANGUAGE_CODE . 默认值为 False .

get_latest_lastmod()[源代码]

Optional. 返回的最新值的方法 lastmod 。此函数用于将 lastmod 属性为 Sitemap index context variables

默认情况下 get_latest_lastmod() 退货:

get_languages_for_item(item)[源代码]

Optional. 返回为其显示项的语言代码序列的方法。默认情况下 get_languages_for_item() 退货 languages

快捷方式

Sitemap框架为常见情况提供了一个便利类:

class GenericSitemap(info_dict, priority=None, changefreq=None, protocol=None)[源代码]

这个 django.contrib.sitemaps.GenericSitemap 类允许您通过向站点地图传递一个词典来创建站点地图,该词典必须至少包含 queryset 进入。此查询集将用于生成站点地图的项目。它还可能有一个 date_field 条目,该条目为从 queryset 。这将用于 lastmod 属性和 get_latest_lastmod() 方法在生成的网站地图中。

这个 prioritychangefreqprotocol 关键字参数允许为所有URL指定这些属性。

例子

下面是一个例子 URLconf 使用 GenericSitemap ::

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",
    ),
]

静态视图的站点地图

通常,您希望搜索引擎爬虫索引既不是对象详细页也不是平面页的视图。解决方案是在 items 并调用 reverse()location 站点地图的方法。例如::

# 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",
    ),
]

创建站点地图索引

views.index(request, sitemaps, template_name='sitemap_index.xml', content_type='application/xml', sitemap_url_name='django.contrib.sitemaps.views.sitemap')

站点地图框架还可以创建引用单个站点 Mapfile 的站点地图索引,每个部分一个引用 sitemaps 字典。唯一的区别是:

下面是上面示例中相关的urlconf行的样子:

from django.contrib.sitemaps import views

urlpatterns = [
    path(
        "sitemap.xml",
        views.index,
        {"sitemaps": sitemaps},
        name="django.contrib.sitemaps.views.index",
    ),
    path(
        "sitemap-<section>.xml",
        views.sitemap,
        {"sitemaps": sitemaps},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

这将自动生成 sitemap.xml 引用两者的文件 sitemap-flatpages.xmlsitemap-blog.xml . 这个 Sitemap 课堂与 sitemaps 听写一点也不改变。

如果所有站点地图都有 lastmod 返回者 Sitemap.get_latest_lastmod() 站点地图索引将有一个 Last-Modified 标头等于最新的 lastmod

如果其中一个站点地图的URL超过50000,则应创建一个索引文件。在这种情况下,Django将自动对站点地图分页,索引将反映这一点。

如果您不使用普通的站点地图视图——例如,如果它用缓存修饰符包装——则必须命名站点地图视图并传递 sitemap_url_name 到索引视图:

from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page

urlpatterns = [
    path(
        "sitemap.xml",
        cache_page(86400)(sitemaps_views.index),
        {"sitemaps": sitemaps, "sitemap_url_name": "sitemaps"},
    ),
    path(
        "sitemap-<section>.xml",
        cache_page(86400)(sitemaps_views.sitemap),
        {"sitemaps": sitemaps},
        name="sitemaps",
    ),
]

模板自定义

如果要对网站上可用的每个站点地图或站点地图索引使用不同的模板,可以通过传递 template_name 参数 sitemapindex 通过urlconf查看:

from django.contrib.sitemaps import views

urlpatterns = [
    path(
        "custom-sitemap.xml",
        views.index,
        {"sitemaps": sitemaps, "template_name": "custom_sitemap.html"},
        name="django.contrib.sitemaps.views.index",
    ),
    path(
        "custom-sitemap-<section>.xml",
        views.sitemap,
        {"sitemaps": sitemaps, "template_name": "custom_sitemap.html"},
        name="django.contrib.sitemaps.views.sitemap",
    ),
]

这些视图返回 TemplateResponse 实例,允许您在呈现前轻松自定义响应数据。有关详细信息,请参阅 TemplateResponse documentation .

上下文变量

自定义模板时 index()sitemap() 视图,您可以依赖以下上下文变量。

索引

变量 sitemaps 是一个对象列表,其中包含 locationlastmod 属性为每个站点地图创建。每个URL公开以下属性:

  • location :站点地图的位置(URL和页面)。

  • lastmod :由 get_latest_lastmod() 方法用于每个站点地图。

站点地图

变量 urlset 是应显示在站点地图中的URL列表。每个URL都显示在 Sitemap 类:

  • alternates

  • changefreq

  • item

  • lastmod

  • location

  • priority

这个 alternates 属性在以下情况下可用 i18nalternates 已启用。它是其他语言版本的列表,包括可选的 x_default 回退,针对每个URL。每个候补者都是一本词典 locationlang_code 钥匙。

这个 item 已经为每个URL添加了属性,以允许更灵活地自定义模板,例如 Google news sitemaps . 假设站点地图 items() 将返回项目列表 publication_data 和A tags 类似这样的字段将生成与Google新闻兼容的站点地图:

<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="https://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:news="https://www.google.com/schemas/sitemap-news/0.9">
{% spaceless %}
{% for url in urlset %}
  <url>
    <loc>{{ url.location }}</loc>
    {% if url.lastmod %}<lastmod>{{ url.lastmod|date:"Y-m-d" }}</lastmod>{% endif %}
    {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}
    {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}
    <news:news>
      {% if url.item.publication_date %}<news:publication_date>{{ url.item.publication_date|date:"Y-m-d" }}</news:publication_date>{% endif %}
      {% if url.item.tags %}<news:keywords>{{ url.item.tags }}</news:keywords>{% endif %}
    </news:news>
   </url>
{% endfor %}
{% endspaceless %}
</urlset>