1. 程式人生 > >django 聚合內容 RSS/Atom

django 聚合內容 RSS/Atom

Django提供了一個高層次的聚合內容框架,讓我們建立RSS/Atom變得簡單,你需要做的只是編寫一個簡單的Python類。

一、範例

要建立一個feed,只需要編寫一個Feed類,然後設定一條指向Feed例項的URLconf就可以了,非常簡單,下面是一個示例,演示了某站點的最近五條新聞記錄:

from django.contrib.syndication.views import Feed
from django.urls import reverse from policebeat.models import NewsItem class LatestEntriesFeed(Feed): title = "Police beat site news" link = "/sitenews/" description = "Updates on changes and additions to police beat central." def items(self): return NewsItem.objects.order_by('-pub_date')[:5] def item_title(self, item): return item.title def item_description(self, item): return item.description # item_link is only needed if NewsItem has no get_absolute_url method. def item_link(self, item): return reverse('news-item', args=[item.pk]) 

要設定連結這個feed的URL,只需要將這個Feed類的例項,作為引數,加入URLconf,如下所示:

from django.conf.urls import url
from myproject.feeds import LatestEntriesFeed urlpatterns = [ # ... url(r'^latest/feed/$', LatestEntriesFeed()), # ... ] 

注意:

  • 新建的Feed類繼承於django.contrib.syndication.views.Feed。
  • title、link和description屬性分別對應標準RSS的<title>
    <link><description>元素。
  • items()方法簡單地返回此Feed需要包含的物件,列表形式。
  • 如果你要建立一個Atom feed,而不是RSS feed,使用subtitle屬性替代description。

還有一件事要做。在一個 RSS feed中,每一個<item>都有一個<title><link> 和<description>, 我們需要告訴框架往這些物件裡放入哪些資料。

  • 對於<title><description>,Django將嘗試呼叫Feed類中的item_title()

    item_description()方法。 這兩個方法都會被傳入一個引數:item,也就是物件自己。

  • 對於<link>,Django首先會嘗試呼叫item_link()方法,如果該方法不存在,則使用物件的ORM模型中定義的get_absolute_url()方法。

二、指定feed型別

預設情況下,使用RSS 2.0型別,如果要指定型別,在Feed類中新增feed_type屬性,如下所示:

from django.utils.feedgenerator import Atom1Feed

class MyFeed(Feed): feed_type = Atom1Feed 

目前可用的型別有下面三種:

  • django.utils.feedgenerator.Rss201rev2Feed (RSS 2.01. Default.)
  • django.utils.feedgenerator.RssUserland091Feed (RSS 0.91.)
  • django.utils.feedgenerator.Atom1Feed (Atom 1.0.)

三、同時釋出Atom和RSS feeds

要同時釋出這兩者,很簡單,為你的Feed類建立一個子類,並且將其feed_type設定為你需要的型別,最後新增一條URLconf就可以了,如下所示:

from django.contrib.syndication.views import Feed
from policebeat.models import NewsItem from django.utils.feedgenerator import Atom1Feed class RssSiteNewsFeed(Feed): title = "Police beat site news" link = "/sitenews/" description = "Updates on changes and additions to police beat central." def items(self): return NewsItem.objects.order_by('-pub_date')[:5] # 增加下面的子類 class AtomSiteNewsFeed(RssSiteNewsFeed): feed_type = Atom1Feed # 修改型別 subtitle = RssSiteNewsFeed.description 

增加路由:

from django.conf.urls import url
from myproject.feeds import RssSiteNewsFeed, AtomSiteNewsFeed urlpatterns = [ # ... url(r'^sitenews/rss/$', RssSiteNewsFeed()), url(r'^sitenews/atom/$', AtomSiteNewsFeed()), # ... ]