Django2.X 生成sitemap.xml 方法

作者:admin 发布:2019-03-20 浏览:1275次

        站点地图是您网站上的一个XML文件,它告诉搜索引擎索引器您的网页更改频率以及某些网页与您网站上其他网页相关的“重要”程度。此信息有助于搜索引擎索引您的网站。


具体生成方法如下:


1、添加'django.contrib.sitemaps'到 settings.py 中的INSTALLED_APPS 。

2、确保您的TEMPLATES设置包含DjangoTemplates 其APP_DIRS选项设置为的后端True。(默认存在

3、创建 sitemap.py ( 以下根据自己模型自行修改 )

from django.contrib.sitemaps import Sitemap
from blog.models import Article, Category, Tag


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

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

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


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

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


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

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


模型中增加(url 根据自己 urls.py 设定的返回,Article、Category、Tag 都要增加

def get_absolute_url(self):
    return '/show-%s.html' % (self.id)

Sitemap类引用

  • class Sitemap[源代码] ¶

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

    • i18n

    • 可选的。

      一个布尔属性,用于定义是否应使用您的所有URL生成此站点地图的URL LANGUAGES默认是 False

    • limit

    • 可选的。

      此属性定义站点地图的每个页面上包含的最大URL数。其值不应超过默认值 50000,即Sitemaps协议中允许的上限

    • protocol

    • 可选的。

      此属性定义站点地图中URL 的协议('http''https')。如果未设置,则使用请求站点地图的协议。如果站点地图是在请求的上下文之外构建的,则默认为'http'

    • priority

    • 可选的。方法或属性。

      如果它是一个方法,它应该采用一个参数 - 一个返回的对象items()- 并将该对象的优先级作为字符串或浮点数返回。

      如果它是一个属性,则其值应为字符串或float,表示返回每个对象 的优先级items()

      示例值priority0.41.0页面的默认优先级是0.5有关更多信息,请参阅sitemaps.org文档

    • 'always'

    • 'hourly'

    • 'daily'

    • 'weekly'

    • 'monthly'

    • 'yearly'

    • 'never'

    • changefreq

    • 可选的。方法或属性。

      如果它是一个方法,它应该采用一个参数 - 一个返回的对象items()- 并将该对象的更改频率作为字符串返回。

      如果它是一个属性,则其值应该是一个字符串,表示返回每个对象的更改频率items()

      changefreq无论您使用方法还是属性,可能的值是:

    • lastmod

    • 可选的。方法或属性。

      如果它是一个方法,它应该采用一个参数 - 一个返回的对象items()- 并返回该对象的最后修改日期/时间作为datetime

      如果它是一个属性,则其值应该是datetime 表示返回的每个对象 的最后修改日期/时间items()

      如果站点地图中的所有项目都具有a lastmod,则生成的站点地图views.sitemap()将具有Last-Modified 等于最新标题lastmod您可以激活 ConditionalGetMiddleware以使Django对具有If-Modified-Since 标题的请求做出适当响应,如果未更改,则会阻止发送站点地图。

    • 好: '/foo/bar/'

    • 坏: 'example.com/foo/bar/'

    • 坏: 'https://example.com/foo/bar/'

    • location[源代码] ¶

    • 可选的。方法或属性。

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

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

      在这两种情况下,“绝对路径”表示不包含协议或域的URL。例子:

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

      要指定除以外的协议'http',请使用 protocol

    • items[源代码] ¶

    • 需要。一种返回对象列表的方法。框架不关心它们是什么类型的对象; 即所有重要的是,这些对象获得通过的location(), lastmod()changefreq()和 priority()方法。

4、urls.py 增加

from blog.sitemap import  ArticleSiteMap, CategorySiteMap, TagSiteMap
from django.contrib.sitemaps.views import sitemap

sitemaps = {

    'Article': ArticleSiteMap,
    'Category': CategorySiteMap,
    'Tag': TagSiteMap,
}




urlpatterns = [
    .
    .
    .
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
]

5、登录系统后台,然后在settings.py 中增加

INSTALLED_APPS = [
     ...
     ...
     
    'django.contrib.sites',
   
]



刷新页面

image.png

填写站点域名

先登录后台再在 settings 增加 sites 否则报错。


6、http://domain.om/sitemap.xml 验证是否正确。


可能遇到的问题:

object has no attribute 'get_absolute_url'

需要在models 对应的类中定义此方法,方法参考以上代码。


标签: Django sitemap

Comments (0)