展开

文章目录

修改历史

给个人博客添加RSS订阅支持

2021-03-11 20:46:17 Python 2149

简介

最近在helloflask群中比较活跃,把自己的网站也发到群里去了,无形之中又装了一波大佬(其实还是菜鸡),有个群友就希望我的博客网站能够提供RSS订阅支持,之前也看到过很多个人博客支持RSS订阅,于是就决定将这个功能添加进来。

1.RSS指北

可能很多小伙伴看到RSS这个缩写或多或少都不太明白其意思,这里稍微做一下指北介绍

a.什么是RSS

RSS是单词Really Simple Syndication三个单词的首个字母,其意思就是简易信息聚合(翻译来自百度百科),它基于XML标准,是一种在互联网上被广泛采用的内容包装和投递协议。RSS是一种描述和同步网站内容的格式,是使用最广泛的XML应用。

b.为什么要采用RSS

假设我有一个个人的博客网站,如果某些用户对我的网站比较感兴趣,一般的操作方式就是收藏我的网站,然后不定期的访问网站来查看我的网站是否有内容进行更新,这样一来对于用户来说就比较耗费时间。如果我的网站提供了RSS订阅源,那么用户只需要订阅我网站的RSS源,就不需要不定期的来访问我的网站来查看是否有内容更新了。当用户订阅了我网站的RSS源之后,每当我的网站有内容更新,用户端的RSS源也会随之更新,这就是RSS的好处,既可以方便用户又可以有效的传播我们的文章。

2.Python生成RSS源

我的网站是基于Python3+Flask来搭建的,所以这里就介绍一下如果使用Python来生成RSS源。

其实RSS本质就是一个.xml文件,我们可以通过很多中方法来生成.xml文件,在这里我使用python-feengen这个第三方库来实现RSS源的生成。首先通过下面的命令安装

pip install feedgen

安装完成之后,根据官方文档写一个简单的示例,代码清单如下

from feedgen.feed import FeedGenerator

fg = FeedGenerator()

fg.id('https://2dogz.cn/')
fg.title('Blogin')
fg.author({'name': 'Blogin', 'email': 'weijiang1994_1@qq.com'})
fg.link(href='https://2dogz.cn/')
fg.logo('https://2dogz.cn/accounts/avatar/%E6%B8%85%E6%B0%B44.jpg/')
fg.subtitle('这是一个测试feed')
# 生成feed
print(fg.atom_str(pretty=True))  # 这里输出的是bytes类型的数据
print(str(fg.atom_str(pretty=True), encoding='utf-8'))

运行结果如下图所示,我们可以看到就是一个xml组织结构的文本

feed

如果你想将其写入xml文件中可以通过fg.atom_file('filename.xml')将其存入到xml文件中去!

上面仅仅是生成feed,我们还需要将实例(entry)填入其中,在上面的代码中加入下面的代码清单

fe = fg.add_entry()
fe.id('https://2dogz.cn/blog/article/34/')
fe.title('不期而至的三月雨')
fe.content('白日依山尽,黄河入海流,欲穷千里目,更上一层楼。')
print(str(fg.atom_str(pretty=True), encoding='utf-8'))

结果如下图,我们可以看到新添加进去的内容被放入到feed节点中了已entry作为节点名

这样就完成了RSS源的生成了。

3.在Flask中使用

最终的目的还是要给我们自己的博客网站提供一个RSS的源,供用户订阅,那么怎么来实现呢?看下面代码清单

@rss_bp.route('/')
def rss_feed():
    blogs = Blog.query.filter_by(delete_flag=1).order_by(Blog.create_time.desc()).all()
    fg = FeedGenerator()
    fg.title('Blogin')
    fg.description('Blogin是一个个人博客网站,后端使用Flask框架,前端使用Bootstrap4,主要分享一些编程类的技术以及一些陈词滥调的文章!')
    fg.link(href='https://2dogz.cn')
    fg.id(str(len(blogs)))
    for blog in blogs:
        fe = fg.add_entry()
        fe.title('[{}]'.format(blog.blog_types.name)+blog.title)
        fe.id(blog.id)
        fe.link(href='https://2dogz.cn//blog/article/{}/'.format(blog.id))
        fe.description(blog.introduce)
        fe.guid(str(blog.id), permalink=False)  # Or: fe.guid(article.url, permalink=True)
        fe.author(name='Blogin', email='weijiang1994_1@qq.com')
        fe.content(blog.content)

    rss_data = str(fg.atom_str(pretty=True), 'utf-8')
    response = make_response(rss_data)
    response.headers.set('Content-Type', 'rss+xml')
    return response

上面的代码来自我自己博客网站rss源生成的代码,其具体操作流程就是先将博客网站上所有的文章从数据库中提取出来,然后通过feedgen来生成.xml标准的文本,然后通过response将其作为返回。我们访问https://2dogz.cn/rss-feed/就可以看到效果了。

4.需要注意的地方

  1. 在给response设置headers的时候记得需要将其设置为rss+xml,不需要设置为application/rss+xml,否则会出现乱码
  2. 博客中如果使用到了图片需要将其设置为绝对路径,否则在RSS阅读器中可能无法看到博客中的图片

0条评论