diff --git a/src/feeds.py b/src/feeds.py new file mode 100644 index 0000000..592c1ce --- /dev/null +++ b/src/feeds.py @@ -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 \ No newline at end of file