温馨提示
欢迎来到木易博客,祝你逛得愉快!

Django博客开发RSS功能

2021年4月29日 17:46 阅读 574 评论 0

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('rss', AllPostsRssFeed(), name='rss'), 

修改模板

因为这个url是唯一、静态的,所以我这里直接写死

<a href="/feed" target="_blank">RSS</a> 

这样 RSS 订阅功能就开发完成了,我们可以用各种解析 RSS 的订阅器进行订阅测试

最后修改于2021年4月29日 18:21
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yangyingqi.com/46.html

Django
微信
支付宝
登录后即可进行评论/回复
文章目录