Django配备了一个高级网站地图生成框架来创建 sitemap HTML文件。
站点地图是网站上的一个XML文件,它告诉搜索引擎索引器页面更改的频率以及某些页面与网站上其他页面的关系“重要程度”。此信息有助于搜索引擎索引您的网站。
Django Sitemap框架允许您用Python代码表示这些信息,从而自动创建此XML文件。
它的工作原理很像Django的 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 物体。返回的对象将传递给与sitemap属性对应的任何可调用方法 (location , lastmod , changefreq ,以及 priority )。
没有 location 方法,但您可以提供它以指定对象的URL。默认情况下, location() 调用 get_absolute_url() 并返回结果。
Sitemap 类引用¶A Sitemap 类可以定义以下方法/属性:
Required. 返回 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' 。
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>
5月 28, 2025