Skip to content

Django - RSS

Django 包含一个高级的联合 Feed 生成框架(django.contrib.syndication),可以轻松创建 RSS 和 Atom Feed。您需要定义一个 Feed 类来描述 Feed 的内容。

先决条件:请确保 'django.contrib.sites' 和 'django.contrib.syndication' 已添加到您 settings.py 文件中的 INSTALLED_APPS 列表,并配置 SITE_ID。

让我们为应用程序中最新的博客文章创建一个 Feed。假设我们有一个简单的 Post 模型:

myapp/models.py
from django.db import models
from django.urls import reverse
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
def get_absolute_url(self):
# 假设您有一个名为 'post_detail' 的 URL,它接受一个 pk 参数
return reverse('post_detail', kwargs={'pk': self.pk})

现在,在您的应用中创建一个 feeds.py 文件(myapp/feeds.py),并定义 Feed 类:

myapp/feeds.py
from django.contrib.syndication.views import Feed
from django.urls import reverse
from django.utils.feedgenerator import Rss201rev2Feed # 或者 Atom1Feed
from .models import Post
class LatestPostsFeed(Feed):
# feed_type = Atom1Feed # 解除注释以使用 Atom feed
title = "我的精彩博客文章"
link = "/blog/" # 主博客页面的链接
description = "我的精彩博客上最新文章的更新。"
def items(self):
"""返回应包含在 Feed 中的对象列表。"""
return Post.objects.order_by('-published_date')[:5] # 获取最新的 5 篇文章
def item_title(self, item):
"""返回每个 item(Post 对象)的标题。"""
return item.title
def item_description(self, item):
"""返回每个 item 的描述。"""
# 您可能希望在此处截断或使用摘要字段
return item.content
# item_link 只有当 Post 模型没有 get_absolute_url() 方法时才需要
# def item_link(self, item):
# """返回每个 item 的 URL。"""
# return reverse('post_detail', args=[item.pk])

Feed 类属性/方法的解释:

  • title、link、description:对应于标准 Feed 元素(RSS 中的 <channel><title>、<channel><link>、<channel><description>)。link 理想情况下应该是要联合发布的内容的主要 URL。
  • feed_type:指定 Feed 格式(默认为 RSS 2.0.1)。对于 Atom Feed,使用 Atom1Feed。
  • items():返回一个可迭代对象(如 QuerySet),这些对象将成为 Feed 中的 item(RSS 中的 <item>)。
  • item_title(item)、item_description(item):接受 items() 方法返回的对象,并返回其标题和描述的方法。
  • item_link(item):返回 item 的永久链接。重要提示: 如果您的模型(如上文的 Post)定义了 get_absolute_url() 方法,Django 会自动使用该方法,您就不需要定义 item_link 了。
  • 还有其他可选方法用于作者、发布日期、分类等。请参阅 Django Syndication Feed 框架文档。

现在,将您的 Feed 类连接到 myapp/urls.py 中的一个 URL:

myapp/urls.py
from django.urls import path
from .feeds import LatestPostsFeed
from . import views # 假设您有 PostDetailView 这样的视图
urlpatterns = [
path('latest/feed/', LatestPostsFeed(), name='post_feed'),
# 假设这是用于单个文章的详情视图
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
# ... 其他应用 URL
]

在这里,访问 /myapp/latest/feed/(或者您在主 urls.py 中包含 myapp.urls 时使用的任何 URL 前缀)将生成 RSS Feed。

运行您的开发服务器,并导航到 Feed URL(例如,http://127.0.0.1:8000/myapp/latest/feed/)。您的浏览器可能会将其显示为格式化的 XML,或提供使用 Feed 阅读器订阅。

输出将是一个遵循 RSS(或 Atom)规范的 XML 文档,包含 Feed 的元数据以及 items() 方法返回的每个 item 的条目,详情由 item_ 方法提供。

然后,您可以从您的网站链接到这个 Feed URL(例如,使用标准的 RSS 图标),以允许用户订阅。