RSS订阅应该是每个博客的标配,这样读者就可以通过一些聚合阅读工具订阅博客,查看是否有文章更新,而不必每次都访问博客查看。现在我们就来为博客添加 RSS 订阅功能。
RSS 简介
RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,它采用 XML 作为内容传递的格式。简单来说就是网站可以把内容包装成符合 RSS 标准的 XML 格式文档。一旦网站内容符合一个统一的规范,那么人们就可以开发一种读取这种规范化的 XML 文档的工具来聚合各大网站的内容。例如一个读者可能关注了很多的博客网站,如果这些博客网站都支持 RSS 订阅的话,他就只需要一个聚合阅读器订阅这些博客,就可以在聚合器工具里看到全部博客的更新内容,而不必再分别访问各个博客去看有没有内容更新了。更多 RSS 的介绍,可参考 rss(简易信息聚合)。
使用 Django Feed 类
根据以上对 RSS 的介绍,我们可以发现关键的地方就是根据网站的内容生成规范化的 XML 文档,幸运的是,Django 已经内置了一些生成这个文档的方法,下面就使用这些方法来创建 RSS 订阅文档。
首先我们在 blog 应用的根目录下(models.py 所在目录)新建一个 feeds.py 文件以存放和 RSS 功能相关的代码。
然后在 feeds.py 中写入如下代码:
from django.contrib.syndication.views import Feed
from django.shortcuts import reverse
from .models import Article
class AllPostsRssFeed(Feed):
# 显示在聚合阅读器上的标题
title = "杨少博客"
# 通过聚合阅读器跳转到网站的地址
link = "/"
# 显示在聚合阅读器上的描述信息
description = "杨少博客是一个后端使用Django开发,前端使用Bootstrap框架的博客,主要分享博主在Python以及其他编程语言的学习心得以及各类项目的开发经验"
# 语言
language = 'zh-CN'
# 需要显示的内容条目
def items(self):
return Article.objects.all()
# 聚合器中显示的内容条目的标题
def item_title(self, item):
return "[%s] %s" % (item.category, item.title)
# 聚合器中显示的内容条目的描述
def item_description(self, item):
return item.content_html
# 返回文章详情页的路由
def item_link(self, item):
return reverse('article', args=(item.id,))
代码并不复杂,相关地方已有注释,你要做的就是将相关内容改成你博客的即可,但是有个地方需要注意
def item_description(self, item):
return item.content_html
这个字段并不是我们数据库中存在的,而是我们在文章模型里写的方法,具体如下:
@property
def body_html(self):
return get_markdown_content(self.content).get("content", "")
@property 装饰器用于将方法转为属性,所以我们在feeds.py中调用时并没有加括号
get_markdown_content()用于将我们存在数据库中的markdown格式的文章内容转为html,如下:
from markdown import markdown
def get_markdown_content(value):
content = markdown(value.replace("\r\n", ' \n'),
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
'markdown.extensions.toc',
])
return {"content": content}
添加URL
一般 RSS 订阅链接为域名后跟/rss,所以我们将 RSS 的url放在项目的urls.py里
from apps.blog.feeds import AllPostsRssFeed
path('feed', AllPostsRssFeed(), name='rss'),
修改模板
因为这个url是唯一、静态的,所以我这里直接写死
<a href="/feed" target="_blank">RSS</a>
这样 RSS 订阅功能就开发完成了,我们可以用各种解析 RSS 的订阅器进行订阅测试
Django版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:https://www.yangyingqi.com/46.html