宁波网站的优化,如何生成自己的网站,安卓app开发实验报告,建设银行网站怎么注销网银1.Rss简介
博客提供 RSS 订阅应该是标配#xff0c;这样读者就可以通过一些聚合阅读工具订阅你的博客#xff0c;时时查看是否有文章更新#xff0c;而不必每次都跳转到博客上来查看。现在我们就来为博客添加 RSS 订阅功能。
RSS#xff08;Really Simple Syndication这样读者就可以通过一些聚合阅读工具订阅你的博客时时查看是否有文章更新而不必每次都跳转到博客上来查看。现在我们就来为博客添加 RSS 订阅功能。
RSSReally Simple Syndication是一种描述和同步网站内容的格式它采用 XML 作为内容传递的格式。简单来说就是网站可以把内容包装成符合 RSS 标准的 XML 格式文档。一旦网站内容符合一个统一的规范那么人们就可以开发一种读取这种规范化的 XML 文档的工具来聚合各大网站的内容。例如一个读者可能关注了很多的博客网站如果这些博客网站都支持 RSS 订阅的话他就只需要一个聚合阅读器订阅这些博客就可以在聚合器工具里看到全部博客的更新内容而不必再分别访问各个博客去看有没有内容更新了。
更多 RSS 的介绍可参考百度。
2.使用 Django Feed 类
根据以上对 RSS 的介绍我们可以发现关键的地方就是根据网站的内容生成规范化的 XML 文档幸运的是Django 已经内置了一些生成这个文档的方法下面就使用这些方法来创建 RSS 订阅文档。
1首先我们在 blog 应用的根目录下models.py 所在目录新建一个 feeds.py 文件以存放和 RSS 功能相关的代码。让后在 feeds.py 中写入如下代码
文件位置blog/feeds.py
from django.contrib.syndication.views import Feedfrom .models import Postclass AllPostsRssFeed(Feed):# 显示在聚合阅读器上的标题title HelloDjango-blog-tutorial# 通过聚合阅读器跳转到网站的地址link /# 显示在聚合阅读器上的描述信息description HelloDjango-blog-tutorial 全部文章# 需要显示的内容条目def items(self):return Post.objects.all()# 聚合器中显示的内容条目的标题def item_title(self, item):return [%s] %s % (item.category, item.title)# 聚合器中显示的内容条目的描述def item_description(self, item):return item.body_html
代码应该不难理解主要就是指定要生成的 XML 文档内容。各个属性和方法的含义已在代码中注释你只需把相关的内容替换成符合你博客的描述即可。
需要注意一点的是def item_description(self, item)这个方法。item 是文章 Post 模型的实例聚合内容的描述我们返回了 body_html 属性的值。模型中原本使用 body 属性存储博客文章的内容但是这些内容是以 Markdown 格式的并非所有的聚合内容阅读器都支持 Markdown 格式的解析因此我们返回的是已经解析后的 HTML 格式内容。但 Post 模型原来并没有 body_html 这个属性的那它是哪里来的呢
2回顾一下Post模型我们来给 Post 模型定义几个属性以便方便地获取解析后的内容和目录
文件位置blog/models.py
from django.utils.functional import cached_propertyclass Post(models.Model):# 省略其它代码propertydef toc(self):return self.rich_content.get(toc, )propertydef body_html(self):return self.rich_content.get(content, )cached_propertydef rich_content(self):return generate_rich_content(self.body)首先看到 rich_content 这个方法它返回的是 generate_rich_content 函数调用后的结果即将 body 属性的值经 Markdown 解析后的内容。但要注意的是我们使用了 django 提供的 cached_property 装饰器这个装饰器和 Python 内置的 property 装饰器功能一样可以将方法转为属性这样就能够以属性访问的方式获取方法返回的值不过 cached_property 进一步提供缓存功能它将被装饰方法调用返回的值缓存起来下次访问时将直接读取缓存内容而不需重复执行方法获取返回结果。例如对博客文章内容的 Markdown 解析是比较耗时的而解析的结果可能被多次访问因此将其缓存起来能起到优化作用。
为了更方便地获取文章的 HTML 格式的内容和目录我们进一步将 generate_rich_content 返回的值放到 toc 和 body_html 两个属性中这里两个属性都从 rich_content 中取值cached_property 的作用就发挥出来了。
3接下来讲解上边调用的generate_rich_content 函数回顾一下 PostDetailView 这个视图
def get_object(self, querysetNone):# 覆写 get_object 方法的目的是因为需要对 post 的 body 值进行渲染post super().get_object(querysetNone)md markdown.Markdown(extensions[markdown.extensions.extra,markdown.extensions.codehilite,# 记得在顶部引入 TocExtension 和 slugifyTocExtension(slugifyslugify),])post.body md.convert(post.body)m re.search(rdiv classtoc\s*ul(.*)/ul\s*/div, md.toc, re.S)post.toc m.group(1) if m is not None else return post我们在获取博客文章 post 的详细内容的视图中使用 markdown 这个 Python 库在解析 post.body 这个属性的值。这个解析的过程其实在很多地方都可能用到不应该写死在 PostDetailView 这个视图里所以我们先将 PostDetailView 视图的 get_object 方法解析 Markdown 内容的过程封装为一个函数暂且将其放在 blog/models.py 中。
文件位置blog/models.py
def generate_rich_content(value):md markdown.Markdown(extensions[markdown.extensions.extra,markdown.extensions.codehilite,# 记得在顶部引入 TocExtension 和 slugifyTocExtension(slugifyslugify),])content md.convert(value)m re.search(rdiv classtoc\s*ul(.*)/ul\s*/div, md.toc, re.S)toc m.group(1) if m is not None else return {content: content, toc: toc}解析过程和原来一样只是将解析得到的 HTML 内容content和目录toc放在一个字典里返回。
3.添加 URL
接下来就是指定 URL 模式让人们访问这个 URL 后就可以看到 Feed 生成的内容。通常 RSS 的 URL 配置直接写在项目的 urls.py 文件里即打开 blogproject/urls.py 文件添加如下代码
文件位置blogproject/urls.py
from blog.feeds import AllPostsRssFeedurlpatterns [path(admin/, admin.site.urls),path(, include(blog.urls)),path(, include(comments.urls)),# 记得在顶部引入 AllPostsRssFeedpath(all/rss/, AllPostsRssFeed(), namerss),
]4.修改模板
简单修改一下 templates/base.html 模板把 RSS 的 URL 添加到模板中
div classrssa href{% url rss %}span classion-social-rss-outline/span RSS 订阅/a
/div此外由于将 Markdown 解析的内容放在了 body_html 属性将之前博客文章详情模板里获取文章内容的代码也做相应调整
文件位置templates/blog/detail.html
div classentry-content clearfix{{ post.body_html|safe }}
/div运行开发服务器在侧边栏点击 RSS 订阅的链接就跳转到 /all/rss/你会看到这对乱码一样的东西这就是生成的 RSS 标准文档当然这个文档不是给你读的而是给 RSS 聚合阅读器工具读的。
5.RSS 测试插件
可以在本地测试一下订阅效果我使用的 Chrome 浏览器安装了一个 RSS Feed Reader 的应用如果你也使用的 Chrome 浏览器可以从应用商店添加它然后就可以在本地测试订阅效果了。如果是其它浏览器自行查找相关 RSS 阅读插件即可。
可以看到订阅成功了订阅界面显示的信息就是我们在 AllPostsRssFeed 类中指定的相关信息。大功告成现在任何人都可以订阅我们的博客了