为django添加sitemap功能

Python 2017-01-14 6877
预计阅读时间:3 分钟

sitemap是 Google 最先引入的网站地图协议,采用 XML 格式,它的作用简而言之就是优化搜索引擎的索引效率,详细的解释可以参考 维基百科。

下面介绍下如何为Django站点添加sitemap功能。

启用sitemap

djangosettings.pyINSTALLED_APPS中添加

'django.contrib.sites',
'django.contrib.sitemaps',

然后migrate数据库:

./manage.py makemigrations
./manage.py migrate

登陆Django后台,修改SITE为你Django网站的域名和名称,然后在settings.py中加入SITE_ID = 1来制定当前的站点。

添加sitemap功能

创建sitemap

创建sitemap.py.内容类似下面的代码:

from django.contrib.sitemaps import Sitemap
from blog.models import Article, Category, Tag
from accounts.models import BlogUser
from django.contrib.sitemaps import GenericSitemap
from django.core.urlresolvers import reverse


class StaticViewSitemap(Sitemap):
    priority = 0.5
    changefreq = 'daily'

    def items(self):
        return ['blog:index', ]

    def location(self, item):
        return reverse(item)


class ArticleSiteMap(Sitemap):
    changefreq = "monthly"
    priority = "0.6"

    def items(self):
        return Article.objects.filter(status='p')

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


class CategorySiteMap(Sitemap):
    changefreq = "Weekly"
    priority = "0.6"

    def items(self):
        return Category.objects.all()

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


class TagSiteMap(Sitemap):
    changefreq = "Weekly"
    priority = "0.3"

    def items(self):
        return Tag.objects.all()

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


class UserSiteMap(Sitemap):
    changefreq = "Weekly"
    priority = "0.3"

    def items(self):
        return BlogUser.objects.all()

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

url配置

url.py中加入:

from DjangoBlog.sitemap import StaticViewSitemap, ArticleSiteMap, CategorySiteMap, TagSiteMap, UserSiteMap

sitemaps = {

    'blog': ArticleSiteMap,
    'Category': CategorySiteMap,
    'Tag': TagSiteMap,
    'User': UserSiteMap,
    'static': StaticViewSitemap
}

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

至此,全部完成,运行你的django程序,浏览器输入:

http://127.0.0.1:8000/sitemap.xml

就可以看见已经成功生成了,然后就可以提交这个地址给搜索引擎。 我的网站的sitemap的地址是:

https://www.lylinux.net/sitemap.xml


本文由 liangliangyy 原创,转载请注明出处。

相关推荐

评论

8
  1. Superficial

    我的sitemap.xml生成了,但我的favicon.ico图片在域名/sitemap.xml中不显示

  2. wuli

    sitemap的域名都是example.com,这个要怎么解决呢。

  3. jingwangnet

    或者这么问 一个project 多个site_id 怎么设置?不会都写在 setting文件里吧?

    • liangliangyy

      如果多个site的话,就需要从request中获取domain了,比如:

      from django.contrib.sites.shortcuts import get_current_site
      sites__id=get_current_site(request).id
      

      参考: 官方文档

  4. jingwangnet

    大佬  你的 输入框 支持 mrakdown  但是 有字数限制 不能贴代码

    用的是 sitemap 通用类 部署到 线上 域名显示的是 localhost 怎么解决 jingwangnet.com/sitemap.xml https://github.com/jingwangnet/jingwang-data-django/blob/master/data/views.py

    • liangliangyy

      没看到localhost呀

      http://jingwangnet.com/detail/company/1/2018-04-080.6

      • jingwangnet

        老哥 后来我花了一早上 发现 我没有设定 site id 。。。。 也没有启用 site 框架 看了好几遍你的帖子 解决了 但是 现在还是有个疑问。通过官方文档 了解到 site 框架 是用于一个项目多个网站的 框架。但是不知道 怎么实现 。请问下 老哥 有没有这方面的实际代码或者资料

发表评论

登录 后发表评论

发现更多