网站地图是根据网站的结构、框架、内容,生成的导航网页,是一个网站所有链接的容器。很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎或者网络蜘蛛抓取网站页面,了解网站的架构,为网络蜘蛛指路,增加网站内容页面的收录概率。网站地图一般存放在域名根目录下并命名为sitemap,比如http://www.liujiangblog.com/sitemap.xml

一个典型的sitemap,其内容片段如下:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.liujiangblog.com/blog/9/</loc>
<lastmod>2017-12-08</lastmod>
<priority>0.4</priority>
</url>
<url>
<loc>http://www.liujiangblog.com/blog/8/</loc>
<lastmod>2017-12-05</lastmod>
<priority>0.4</priority>
</url>
<url>
<loc>http://www.liujiangblog.com/blog/7/</loc>
<lastmod>2017-11-19</lastmod>
<priority>0.4</priority>
</url>
# 更多内容未列出

Django自带了一个高级的生成网站地图的框架,我们可以很容易地创建出XML格式的网站地图。创建网站地图,只需编写一个Sitemap类,并在URLconf中编写对应的访问路由。

一、安装

安装sitemap框架的步骤如下:

  1. 在INSTALLED_APPS设置中添加'django.contrib.sitemaps' .
  2. 确认settings.py中的TEMPLATES设置包含DjangoTemplates后端,并将APP_DIRS选项设置为True。其实,默认配置就是这样的,只有当你曾经修改过这些设置,才需要调整过来。
  3. 确认你已经安装sites框架. (注意: 网站地图APP并不需要在数据库中建立任何数据库表。修改INSTALLED_APPS的唯一原因是,以便Loader()模板加载器可以找到默认模板。)

二、初始化

为了在网站上激活站点地图生成功能,请把以下代码添加到URLconf中:

from django.contrib.sitemaps.views import sitemap

url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap')

当用户访问/sitemap.xml时,Django将生成并返回一个网站地图。

网站地图的文件名并不重要,重要的是文件的位置。搜索引擎只会索引网站的当前URL层级及下属层级。例如,如果sitemap.xml位于根目录中,它会引用网站中的任何URL。 但是如果站点地图位于/content/sitemap.xml,则它只能引用以/content/开头的网址。

sitemap视图需要一个额外的必需参数: {'sitemaps': sitemaps}sitemaps应是一个字典,将部门的标签(例如news或blog)映射到其 Sitemap类(例如,NewsSitemap或BlogSitemap)。也可以映射到Sitemap类的实例(例如,BlogSitemap(some_var))。

三、范例

假设你有一个博客系统,拥有Entry模型,并且你希望站点地图包含指向每篇博客文章的所有链接。 以下是Sitemap类的写法:

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分别对应于HTML页面中的<changefreq><priority>标签。
  • items()只是一个返回对象列表的方法。
  • lastmod方法应该返回一个datetime时间对象。
  • 在此示例中没有编写location方法,但你可以自己增加此方法来指定对象的URL。默认情况下,location()在每个对象上调用get_absolute_url()并将返回结果作为对象的url。也就是说,使用站点地图的模型,比如Entry,需要在模型内部实现get_absolute_url()方法。

四、Sitemap类详解

class Sitemap[source]

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

1. items[source]

必须定义。返回对象列表的方法。

框架不关心对象的类型,重要的是这些对象将被传递给location(),lastmod(),changefreq()和priority()方法。

2. location[source]

可选。 其值可以是一个方法或属性。

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

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

上面所说的“绝对路径”表示不包含协议和域名的URL。 例子:

正确:'/foo/bar/'
错误:'example.com/foo/bar/'
错误:'https://example.com/foo/bar/'

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

该属性最终反映到HTML页面上的<loc></loc>标签。

3. lastmod

可选。 一个方法或属性。表示当前条目最后的修改时间。

4. changefreq

可选。 一个方法或属性。表示当前条目修改的频率。

changefreq的允许值为:

'always'
'hourly'
'daily'
'weekly'
'monthly'
'yearly'
'never'

5. priority

可选。表示当前条目在网站中的权重系数,优先级。

示例值:0.4,1.0。 页面的默认优先级为0.5,最高为1.0。

6. protocol

可选的。定义网站地图中的网址的协议('http'或'https')。

7. limit

可选的。定义网站地图的每个网页上包含的最大超级链接数。

8. i18n

可选的。一个boolean属性,定义是否应使用所有语言生成此网站地图。默认值为False。

五、快捷方式

sitemap框架提供了一个快捷类,帮助我们迅速生成网站地图:

class GenericSitemap[source]

通过它,我们无需为sitemap编写单独的视图模块,直接在URLCONF中,获取对象,获取参数,传递参数,设置url,如下所示,一条龙服务:

from django.conf.urls import url
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from blog.models import Entry info_dict = {
'queryset': Entry.objects.all(),
'date_field': 'pub_date',
} urlpatterns = [
# some generic view using info_dict
# ... # the sitemap
url(r'^sitemap\.xml$', sitemap,
{'sitemaps': {'blog': GenericSitemap(info_dict, priority=0.6)}},
name='django.contrib.sitemaps.views.sitemap'),
]

六、静态视图的Sitemap

有时候,我们不希望在站点地图中出现一些静态页面,比如商品的详细信息页面。要怎么做呢?解决方案是在items中显式列出这些页面的网址名称,并在网站地图的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.conf.urls import url
from django.contrib.sitemaps.views import sitemap from .sitemaps import StaticViewSitemap
from . import views sitemaps = {
'static': StaticViewSitemap,
} urlpatterns = [
url(r'^$', views.main, name='main'),
url(r'^about/$', views.about, name='about'),
url(r'^license/$', views.license, name='license'),
# ...
url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap')
]

上面做法的本质,是我先找出不想展示的页面,然后反向选择一下,获取想生成站点条目的对象,最后展示到站点地图中。你可以简单的理解为‘反选’。

第六章:Django 综合篇 - 7:网站地图sitemap的更多相关文章

  1. ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...

  2. 创建Google网站地图Sitemap.xml

    Sitemap.xml是google搞出来的,也就是网站地图,不过这个网站地图是用xml写的,而且要按google的标准来写,并且要将写出来的这个文件sitemap.xml上传到自己的服务器空间中去. ...

  3. django网站地图sitemap

    网站地图是根据网站的结构.框架.内容,生成的导航网页,是一个网站所有链接的容器.很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎或者网络蜘蛛抓取网站页面,了解网站的架构,为网络蜘蛛指 ...

  4. 织梦dedecms中html和xml格式的网站地图sitemap制作方法

    sitemap是网站上各网页的列表.创建并提交sitemap有助于百度(Google)发现并了解您网站上的所有网页,包括百度通过传统抓取方式可能找不到的网页.还可以使用sitemap提供有关你网站的其 ...

  5. 织梦dedecms默认网站地图sitemap.html优化

    网站地图对于网站优化很重要,搜索引擎就是靠网站地图去收录网站页面,本文主要讲解优化织梦自带的网站地图功能.     织梦自带的网站地图使用方法:织梦后台--生成--HTML更新--更新网站地图,可以在 ...

  6. 第六章Django

    web应用程序 server端建立socket,不断地accept,当收到客户端连接信号之后,服务端向客户端发送数据,将html网页打开,read出来,并发送至客户端,这样客户端就可以浏览到网页的内容 ...

  7. 网站地图sitemap.xml的格式

    URL列表—XML格式及规范说明: 标签名称  属性  标签说明  标签类型  标签限制  可选/必选  urlset  / urlset用来标记整个文档的开头  /  /  必选  url  / u ...

  8. Django 综合篇

    前面,已经将Django最主要的五大系统介绍完毕,除了这些主要章节,还有很多比较重要的内容,比如开发流程相关.安全.本地化与国际化.常见工具和一些框架核心功能.这些内容的篇幅都不大,但整合起来也是Dj ...

  9. 《Django By Example》第六章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:无他,祝大家年会都中奖!) 第六章 ...

随机推荐

  1. 【百度飞桨】手写数字识别模型部署Paddle Inference

    从完成一个简单的『手写数字识别任务』开始,快速了解飞桨框架 API 的使用方法. 模型开发 『手写数字识别』是深度学习里的 Hello World 任务,用于对 0 ~ 9 的十类数字进行分类,即输入 ...

  2. 2022-7-21 第七组 pan小堂 继承与super与this

    1.继承 1.1继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 1.2继承的格式 class 子类 ...

  3. 丽泽普及2022交流赛day16 社论

    这场比较平凡吧 . 省流: http://zhengruioi.com/contest/1087 目录 目录 A. Gene 题面 题解 算法一(正解) 算法二 B. Fight 题面 题解 算法一( ...

  4. Docker容器保姆:在centos7.6上利用docker-compose统一管理容器和服务

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_108 众所周知,一个大型的Docker容器组成的微服务应用中,容器的数量是非常巨大的,如果依赖传统的人工配置方式进行维护,对于开发 ...

  5. 《ABP Framework 极速开发》教程首发

    写在发布之前 有没有小伙伴跟我刚开始接触 ABP Framework 的感觉一样"一看文档深似海",看完文档之后,想要上手却找不着头绪. 本套教程写作的目的之一是为初学者提供一条相 ...

  6. 蔚来杯2022牛客暑期多校训练营6 ABGJM

    比赛链接 A 题解 知识点:数学,构造. 题目要求构造一个长为 \(m\) 的序列 \(c\) ,\(m\) 自选,使得 \(c\) 的无限循环序列 \(b\) 中任意连续 \(a_i\) 个数中都存 ...

  7. Python爬虫:为什么你爬取不到网页数据

    前言: 之前小编写了一篇关于爬虫为什么爬取不到数据文章(文章链接为:Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章), 但是当时小编也是胡乱编写的,其实里面有很多问题的,现在小编重新发 ...

  8. BZOJ1977/LuoguP4180【模板】严格次小生成树[BJWC2010] (次小生成树)

    这道题本身思维难度不大,但综合性强,细节多 在其上浪一个早上,你的 最小生成树 树链剖分 线段树 DEBUG能力... 都大幅提升 细节与思路都在代码里面了. 欢迎hack. #include< ...

  9. Dynamic CRM一对多关系的数据删除时设置自动删除关联的数据

    在业务实体中主子表非常常见,然后子表可能有会有自己的子表或者多对多关系,在删除的业务场景下,删除主数据,剩余的子数据就成了脏数据, 之前的做法是,监听主表的删除事件,然后在插件中找到其下的子表数据然后 ...

  10. 我写的蓝宝石留言本php版 v4.5

    蓝宝石留言本php版v4.5采用原生php编写,在php5.6~php7.x下调试通过.本留言本使用了utf-8编码. include/config1.php是数据库连接参数的配置文件, includ ...