Django Sitemap 站点地图的实现方法


Posted in Python onApril 29, 2019

Django 中自带了 sitemap框架,用来生成 xml 文件

Sitemap(站点地图)是通知搜索引擎页面的地址,页面的重要性,帮助站点得到比较好的收录。 白话文就是:一个写了你网站的所有url的xml文件,告诉搜索引擎,请及时收录我的这些地址。

sitemap 很重要,可以用来通知搜索引擎页面的地址,页面的重要性,帮助站点得到比较好的收录。

开启sitemap功能的步骤

settings.py 文件中 django.contrib.sitemaps 和 django.contrib.sites 要在 INSTALL_APPS 中

INSTALLED_APPS = (
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'django.contrib.sites',
  'django.contrib.sitemaps',
  'django.contrib.redirects',
   
  #####
  #othther apps
  #####
)

Django 1.7 及以前版本:

TEMPLATE_LOADERS 中要加入 'django.template.loaders.app_directories.Loader',像这样:

TEMPLATE_LOADERS = (
  'django.template.loaders.filesystem.Loader',
  'django.template.loaders.app_directories.Loader',
 )

Django 1.8 及以上版本新加入了 TEMPLATES 设置,其中 APP_DIRS 要为 True,比如:

# NOTICE: code for Django 1.8, not work on Django 1.7 and below
TEMPLATES = [
  {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [
      os.path.join(BASE_DIR,'templates').replace('\\', '/'),
    ],
    'APP_DIRS': True,
  },
]

然后在 urls.py 中如下配置:

from django.conf.urls import url
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
 
from blog.models import Entry
 
 
sitemaps = {
  'blog': GenericSitemap({'queryset': Entry.objects.all(), 'date_field': 'pub_date'}, priority=0.6),
  # 如果还要加其它的可以模仿上面的
}
 
urlpatterns = [
  # some generic view using info_dict
  # ...
 
  # the sitemap
  url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
    name='django.contrib.sitemaps.views.sitemap'),
]

但是这样生成的 sitemap,如果网站内容太多就很慢,很耗费资源,可以采用分页的功能:

from django.conf.urls import url
from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
 
from blog.models import Entry
 
from django.contrib.sitemaps import views as sitemaps_views
from django.views.decorators.cache import cache_page
 
 
sitemaps = {
  'blog': GenericSitemap({'queryset': Entry.objects.all(), 'date_field': 'pub_date'}, priority=0.6),
  # 如果还要加其它的可以模仿上面的
}
 
urlpatterns = [
  url(r'^sitemap\.xml$',
    cache_page(86400)(sitemaps_views.index),
    {'sitemaps': sitemaps, 'sitemap_url_name': 'sitemaps'}),
  url(r'^sitemap-(?P<section>.+)\.xml$',
    cache_page(86400)(sitemaps_views.sitemap),
    {'sitemaps': sitemaps}, name='sitemaps'),
]

这样就可以看到类似如下的 sitemap,如果本地测试访问 http://localhost:8000/sitemap.xml

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=2</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=3</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=4</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=5</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=6</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=7</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=8</loc></sitemap>
<sitemap><loc>http://www.ziqiangxuetang.com/sitemap-tutorials.xml?p=9</loc></sitemap>
</sitemapindex>

查看了下分页是实现了,但是全部显示成了 ?p=页面数,而且在百度站长平台上测试,发现这样的sitemap百度报错,于是看了下 Django的源代码:

在这里 https://github.com/django/django/blob/1.7.7/django/contrib/sitemaps/views.py

于是对源代码作了修改,变成了本站的sitemap的样子,比 ?p=2 这样更优雅

引入 下面这个 比如是 sitemap_views.py

import warnings
from functools import wraps
 
from django.contrib.sites.models import get_current_site
from django.core import urlresolvers
from django.core.paginator import EmptyPage, PageNotAnInteger
from django.http import Http404
from django.template.response import TemplateResponse
from django.utils import six
 
def x_robots_tag(func):
  @wraps(func)
  def inner(request, *args, **kwargs):
    response = func(request, *args, **kwargs)
    response['X-Robots-Tag'] = 'noindex, noodp, noarchive'
    return response
  return inner
 
@x_robots_tag
def index(request, sitemaps,
     template_name='sitemap_index.xml', content_type='application/xml',
     sitemap_url_name='django.contrib.sitemaps.views.sitemap',
     mimetype=None):
 
  if mimetype:
    warnings.warn("The mimetype keyword argument is deprecated, use "
      "content_type instead", DeprecationWarning, stacklevel=2)
    content_type = mimetype
 
  req_protocol = 'https' if request.is_secure() else 'http'
  req_site = get_current_site(request)
 
  sites = []
  for section, site in sitemaps.items():
    if callable(site):
      site = site()
    protocol = req_protocol if site.protocol is None else site.protocol
    for page in range(1, site.paginator.num_pages + 1):
      sitemap_url = urlresolvers.reverse(
          sitemap_url_name, kwargs={'section': section, 'page': page})
      absolute_url = '%s://%s%s' % (protocol, req_site.domain, sitemap_url)
      sites.append(absolute_url)
 
  return TemplateResponse(request, template_name, {'sitemaps': sites},
              content_type=content_type)
 
@x_robots_tag
def sitemap(request, sitemaps, section=None, page=1,
      template_name='sitemap.xml', content_type='application/xml',
      mimetype=None):
 
  if mimetype:
    warnings.warn("The mimetype keyword argument is deprecated, use "
      "content_type instead", DeprecationWarning, stacklevel=2)
    content_type = mimetype
 
  req_protocol = 'https' if request.is_secure() else 'http'
  req_site = get_current_site(request)
 
  if section is not None:
    if section not in sitemaps:
      raise Http404("No sitemap available for section: %r" % section)
    maps = [sitemaps[section]]
  else:
    maps = list(six.itervalues(sitemaps))
     
  urls = []
  for site in maps:
    try:
      if callable(site):
        site = site()
      urls.extend(site.get_urls(page=page, site=req_site,
                   protocol=req_protocol))
    except EmptyPage:
      raise Http404("Page %s empty" % page)
    except PageNotAnInteger:
      raise Http404("No page '%s'" % page)
  return TemplateResponse(request, template_name, {'urlset': urls},
              content_type=content_type)

如果还是不懂,可以下载附件查看:zqxt_sitemap.zip

更多参考:

官方文档:https://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的lambda表达式用法详解
Jun 22 Python
Python实现的字典值比较功能示例
Jan 08 Python
详解python字节码
Feb 07 Python
python web基础之加载静态文件实例
Mar 20 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
安装并免费使用Pycharm专业版(学生/教师)
Sep 24 Python
C++和python实现阿姆斯特朗数字查找实例代码
Dec 07 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 02 Python
Python制作表白爱心合集
Jan 22 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
Apr 29 #Python
python实现微信定时每天和女友发送消息
Apr 29 #Python
Python3.5常见内置方法参数用法实例详解
Apr 29 #Python
python微信撤回监测代码
Apr 29 #Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 #Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 #Python
python抓取需要扫微信登陆页面
Apr 29 #Python
You might like
使用php 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
总结Python编程中函数的使用要点
2016/03/20 Python
Python出现segfault错误解决方法
2016/04/16 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
商务英语专业自荐信
2013/10/14 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
交通事故代理词范文
2015/05/23 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python