Django附带了一个高级站点地图生成框架来创建 sitemap XML文件。
站点地图是网站上的一个XML文件,它告诉搜索引擎索引器页面更改的频率以及某些页面与网站上其他页面的关系“重要程度”。此信息有助于搜索引擎索引您的网站。
Django Sitemap框架允许您用Python代码表示这些信息,从而自动创建此XML文件。
它很像姜戈的 syndication framework . 要创建站点地图,请编写 Sitemap
在你的 URLconf .
要安装站点地图应用程序,请执行以下步骤:
添加 'django.contrib.sitemaps'
对你 INSTALLED_APPS
设置。
确定你的 TEMPLATES
设置包含 DjangoTemplates
后端谁的 APP_DIRS
选项设置为 True
. 默认情况下它就在里面,所以如果你改变了设置,你只需要改变这个。
确保已安装 sites framework
.
(注意:站点地图应用程序不安装任何数据库表。它需要进入的唯一原因 INSTALLED_APPS
就是这样 Loader()
模板加载器可以找到默认模板。)
要激活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
应该是映射一个短节标签的字典(例如, blog
或 news
) Sitemap
类(例如, BlogSitemap
或 NewsSitemap
)它也可以映射到 实例 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
注:
changefreq
和 priority
类属性是否与 <changefreq>
和 <priority>
元素。它们可以作为函数调用,例如 lastmod
在例子中。
items()
是返回 sequence 或 QuerySet
对象。返回的对象将传递给与站点地图属性对应的任何可调用方法 (location
, lastmod
, changefreq
和 priority
)
没有 location
方法,但您可以提供它以指定对象的URL。默认情况下, location()
调用 get_absolute_url()
并返回结果。
Sitemap
类引用¶A Sitemap
类可以定义以下方法/属性:
必修的。 返回 sequence 或 QuerySet
对象。框架不在乎什么 type 它们是对象;重要的是这些对象被传递到 location()
, lastmod()
, changefreq()
和 priority()
方法。
可选的。 方法或属性。
如果它是一个方法,它应该返回给定对象的绝对路径 items()
.
如果它是一个属性,它的值应该是一个表示绝对路径的字符串 每一个 对象返回者 items()
.
在这两种情况下,“绝对路径”是指不包括协议或域的URL。实例:
好: '/foo/bar/'
不好的: 'example.com/foo/bar/'
不好的: 'https://example.com/foo/bar/'
如果 location
未提供,框架将调用 get_absolute_url()
返回的每个对象的方法 items()
.
指定除 'http'
使用 protocol
.
可选的。 方法或属性。
如果它是一个方法,它应该接受一个参数——由返回的对象 items()
--并将该对象的上次修改日期/时间作为 datetime
.
如果它是一个属性,它的值应该是 datetime
表示上次修改的日期/时间 每一个 对象返回者 items()
.
如果站点地图中的所有项目 lastmod
,生成的站点地图 views.sitemap()
将有一个 Last-Modified
标题等于最新 lastmod
. 您可以激活 ConditionalGetMiddleware
使Django以 If-Modified-Since
标题,它将阻止发送未更改的站点地图。
Optional.
此属性返回一个 Paginator
为 items()
。如果您在批处理中生成站点地图,您可能希望将其作为缓存属性来覆盖,以避免多次 items()
打电话。
可选的。 方法或属性。
如果它是一个方法,它应该接受一个参数——由返回的对象 items()
--并以字符串形式返回该对象的更改频率。
如果它是一个属性,它的值应该是一个字符串,表示 每一个 对象返回者 items()
.
的可能值 changefreq
,无论您使用的是方法还是属性,都是:
'always'
'hourly'
'daily'
'weekly'
'monthly'
'yearly'
'never'
可选的。 方法或属性。
如果它是一个方法,它应该接受一个参数——由返回的对象 items()
--并以字符串或浮点形式返回该对象的优先级。
如果它是一个属性,它的值应该是表示优先级的字符串或浮点 每一个 对象返回者 items()
.
示例值 priority
: 0.4
, 1.0
. 页面的默认优先级为 0.5
. 见 sitemaps.org documentation
Optional.
此属性定义协议 ('http'
或 'https'
站点地图中的URL。如果未设置,则使用请求站点地图时使用的协议。如果站点地图是在请求上下文之外构建的,则默认为 'https'
。
在旧版本中,在请求上下文之外构建的站点地图的默认协议是 'http'
。
Optional.
此属性定义站点地图每页上包含的最大URL数。其值不应超过默认值 50000
,这是 Sitemaps protocol .
Optional.
A sequence 属于 language codes 用于在以下情况下生成备用链接 i18n
已启用。默认为 LANGUAGES
.
Optional.
布尔属性。当与 i18n
生成的url每个都有一个指向其他语言版本的备用链接的列表 hreflang attribute . 默认值为 False
.
Optional.
布尔属性。什么时候? True
由生成的备用链接 alternates
将包含 hreflang="x-default"
值为的回退条目 LANGUAGE_CODE
. 默认值为 False
.
Optional. 返回的最新值的方法 lastmod
。此函数用于将 lastmod
属性为 Sitemap index context variables 。
默认情况下 get_latest_lastmod()
退货:
如果 lastmod
是一种方法:最新的 lastmod
通过调用该方法返回的所有项返回 Sitemap.items()
。
Optional. 返回为其显示项的语言代码序列的方法。默认情况下 get_languages_for_item()
退货 languages
。
Sitemap框架为常见情况提供了一个便利类:
这个 django.contrib.sitemaps.GenericSitemap
类允许您通过向站点地图传递一个词典来创建站点地图,该词典必须至少包含 queryset
进入。此查询集将用于生成站点地图的项目。它还可能有一个 date_field
条目,该条目为从 queryset
。这将用于 lastmod
属性和 get_latest_lastmod()
方法在生成的网站地图中。
这个 priority
, changefreq
和 protocol
关键字参数允许为所有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",
),
]
站点地图框架还可以创建引用单个站点 Mapfile 的站点地图索引,每个部分一个引用 sitemaps
字典。唯一的区别是:
在URLCONF中使用两个视图: django.contrib.sitemaps.views.index()
和 django.contrib.sitemaps.views.sitemap()
.
这个 django.contrib.sitemaps.views.sitemap()
视图应采用 section
关键字参数。
下面是上面示例中相关的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.xml
和 sitemap-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
参数 sitemap
和 index
通过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 .
变量 sitemaps
是一个对象列表,其中包含 location
和 lastmod
属性为每个站点地图创建。每个URL公开以下属性:
location
:站点地图的位置(URL和页面)。
lastmod
:由 get_latest_lastmod()
方法用于每个站点地图。
变量 urlset
是应显示在站点地图中的URL列表。每个URL都显示在 Sitemap
类:
alternates
changefreq
item
lastmod
location
priority
这个 alternates
属性在以下情况下可用 i18n
和 alternates
已启用。它是其他语言版本的列表,包括可选的 x_default
回退,针对每个URL。每个候补者都是一本词典 location
和 lang_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>
12月 18, 2023