|
|
|
|
@ -0,0 +1,83 @@
|
|
|
|
|
# 导入必要的模块和类
|
|
|
|
|
from django.contrib.auth import get_user_model # 用于获取自定义用户模型
|
|
|
|
|
from django.contrib.syndication.views import Feed # Django内置的Feed基类,用于生成RSS/Atom订阅
|
|
|
|
|
from django.utils import timezone # 处理时间相关操作
|
|
|
|
|
from django.utils.feedgenerator import Rss201rev2Feed # RSS 2.0版本的生成器
|
|
|
|
|
|
|
|
|
|
from blog.models import Article # 导入博客文章模型
|
|
|
|
|
from djangoblog.utils import CommonMarkdown # 导入Markdown处理工具,用于将文章内容转换为HTML
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DjangoBlogFeed(Feed):
|
|
|
|
|
"""
|
|
|
|
|
自定义博客RSS订阅Feed类,继承自Django的Feed基类,用于生成博客文章的RSS订阅源
|
|
|
|
|
"""
|
|
|
|
|
# 指定Feed类型为RSS 2.0版本(符合Rss201rev2Feed规范)
|
|
|
|
|
feed_type = Rss201rev2Feed
|
|
|
|
|
|
|
|
|
|
# RSS源的描述信息(会显示在订阅源的描述中)
|
|
|
|
|
description = '大巧无工,重剑无锋.'
|
|
|
|
|
# RSS源的标题(订阅源的名称)
|
|
|
|
|
title = "且听风吟 大巧无工,重剑无锋. "
|
|
|
|
|
# RSS源的链接(通常指向网站的订阅页面)
|
|
|
|
|
link = "/feed/"
|
|
|
|
|
|
|
|
|
|
def author_name(self):
|
|
|
|
|
"""
|
|
|
|
|
定义订阅源的作者名称
|
|
|
|
|
这里取系统中第一个用户的昵称作为作者名
|
|
|
|
|
"""
|
|
|
|
|
return get_user_model().objects.first().nickname
|
|
|
|
|
|
|
|
|
|
def author_link(self):
|
|
|
|
|
"""
|
|
|
|
|
定义订阅源作者的链接
|
|
|
|
|
这里取系统中第一个用户的个人主页链接(需用户模型实现get_absolute_url方法)
|
|
|
|
|
"""
|
|
|
|
|
return get_user_model().objects.first().get_absolute_url()
|
|
|
|
|
|
|
|
|
|
def items(self):
|
|
|
|
|
"""
|
|
|
|
|
定义订阅源包含的项目(即文章列表)
|
|
|
|
|
返回条件:类型为'article'(type='a')、状态为'已发布'(status='p')的文章
|
|
|
|
|
排序方式:按发布时间倒序(最新发布的在前)
|
|
|
|
|
数量限制:最多返回5篇文章
|
|
|
|
|
"""
|
|
|
|
|
return Article.objects.filter(type='a', status='p').order_by('-pub_time')[:5]
|
|
|
|
|
|
|
|
|
|
def item_title(self, item):
|
|
|
|
|
"""
|
|
|
|
|
定义单个项目(文章)的标题
|
|
|
|
|
参数item:从items()方法返回的单个Article对象
|
|
|
|
|
返回文章的标题
|
|
|
|
|
"""
|
|
|
|
|
return item.title
|
|
|
|
|
|
|
|
|
|
def item_description(self, item):
|
|
|
|
|
"""
|
|
|
|
|
定义单个项目(文章)的描述内容
|
|
|
|
|
使用CommonMarkdown工具将文章的Markdown格式正文转换为HTML,作为订阅中的描述
|
|
|
|
|
"""
|
|
|
|
|
return CommonMarkdown.get_markdown(item.body)
|
|
|
|
|
|
|
|
|
|
def feed_copyright(self):
|
|
|
|
|
"""
|
|
|
|
|
定义订阅源的版权信息
|
|
|
|
|
格式为"Copyright© 年份 且听风吟",年份自动获取当前时间的年份
|
|
|
|
|
"""
|
|
|
|
|
now = timezone.now()
|
|
|
|
|
return "Copyright© {year} 且听风吟".format(year=now.year)
|
|
|
|
|
|
|
|
|
|
def item_link(self, item):
|
|
|
|
|
"""
|
|
|
|
|
定义单个项目(文章)的链接
|
|
|
|
|
返回文章的绝对URL(需Article模型实现get_absolute_url方法)
|
|
|
|
|
"""
|
|
|
|
|
return item.get_absolute_url()
|
|
|
|
|
|
|
|
|
|
def item_guid(self, item):
|
|
|
|
|
"""
|
|
|
|
|
定义单个项目的全局唯一标识符(GUID)
|
|
|
|
|
此处未实现具体逻辑,可根据需求补充(如返回文章ID或唯一URL等)
|
|
|
|
|
"""
|
|
|
|
|
return
|