为你的Django站点添加订阅与站点地图

博客折腾了一段时间,总算是部署上来了,也用了段时间,感觉还可以吧,发现唯一的缺点就是没有sitemap.xmlrss.xml/atom.xml的功能,趁着下午有时间就折腾了下,这两个功能Django已经帮你做好了,调用就可以了。

RSS/Atom订阅

新建一个feeds.py文件,内容如下:

#!/use/bin/env python
# _*_ coding:utf-8 __

from django.contrib.syndication.views import Feed
from .models import Article
from django.utils.feedgenerator import Rss201rev2Feed
from django.utils.feedgenerator import Atom1Feed
from markdown2 import markdown


class ExtendedRSSFeed(Rss201rev2Feed):
# 设置返回到浏览器头部文档类型xml
mime_type = 'application/xml'


class RssSiteNewsFeed(Feed):
feed_type = ExtendedRSSFeed
author_name = "安生"
title = "安生's Blog | 大好时光!"
link = "https://blog.ansheng.me/"
description = "大好时光"
feed_url = 'https://blog.ansheng.me/rss.xml'

def items(self):
# 获取所有的文章,以创建时间倒叙
return Article.objects.all().order_by('-created_time')

def item_title(self, item):
# 文章标题
return item.title

def item_description(self, item):
# 文章的概要,因为我使用markdown语法写文章的,所以需要把它转换为HTML
return markdown(item.abstract)

def item_link(self, item):
# 文章的链接地址
return '/article/%s' % item.url

def item_pubdate(self, item):
# 文章创建时间
return item.created_time

def item_guid(self, item):
# 返回空即可,要不然文章链接就要重复两边
return


class AtomSiteNewsFeed(RssSiteNewsFeed):
# ATOM功能,大致和RSS一样,只不过是两种订阅方式
feed_type = Atom1Feed
subtitle = RssSiteNewsFeed.description

配置url.py

from django.conf.urls import url
from blog.feeds import RssSiteNewsFeed, AtomSiteNewsFeed

urlpatterns = [
url(r'^rss\.xml$', RssSiteNewsFeed()),
url(r'^atom\.xml$', AtomSiteNewsFeed()),
]

URL配置倒没什么好解释的,打开Safari浏览器,输入http://127.0.0.1:8000/rss.xmlhttp://127.0.0.1:8000/atom.xml将得到两种不同类型的订阅:

1483793245

点击添加

1483793276

然后你所有的文章就被添加到订阅列表了,但是我不知道为什么谷歌浏览器解析出来的却不是标准的rss.xml文档,而显示的是字符串:

1483793337

站点地图

站点地图与订阅的实现方式类似,首先我们需要创建sitemap.py文件,内容为:

#!/use/bin/env python
# _*_ coding:utf-8 __

from django.contrib.sitemaps import Sitemap
from blog.models import Article


class BlogSitemap(Sitemap):
changefreq = "daily" # 每天发布
priority = 1.0 # 优先级,最大1.0
protocol = 'https' # 站点是http还是https类型

def items(self):
# 获取所有被标记为已发布的文章,必须是一个列表
return Article.objects.filter(status=0)

def lastmod(self, obj):
# 创建时间
return obj.last_modified_time

def location(self, item):
# URL
return '/article/%s' % item.url

URL配置:

from django.conf.urls import url
from django.contrib.sitemaps.views import sitemap
from blog.sitemap import BlogSitemap

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

哦~,差点忘记了,你还需要在settings.pyINSTALLED_APPS中添加django.contrib.sitemapsAPP。

INSTALLED_APPS = [
......
'django.contrib.sitemaps'
]

最后打开你的浏览器,输入https://blog.ansheng.me/sitemap.xml(请替换成你自己的链接),然后就可以看到sitemap信息了。

1483793688

好了,到此结束,内容比较简单,希望能够帮到你~


wechat