django feed rss

2016/6/6 posted in  python

RSS的基本原理

RSS是在互联网上被广泛采用的内容包装和投递协议。网络用户可以在客户端借助于支持RSS的新闻工具软件,在不打开网站内容页面的情况下,阅读支持RSS输出的网站内容。

    <?xml version="1.0" encoding="gb2312" ?> 
    <rss version="2.0"> 
    <channel> 
      <title>我的Blog</title>                 //channel的标题
      <description>与我自己的技术Blog相关联</description>   //channel的介绍
      <link>http://counter.csdn.net/pv.aspx?id=72</link>     //channel的url
      <item> 
      <title><!-- 项标题 --></title>           //item的标题
      <link><!-- 项 URL --></link>           //item的url
      <description><!-- 简要描述 --></description>        //item的介绍
      <!-- 可选的/可扩展的元素 -->        //item的其他属性,比如更新时间
      </item> 
      <item>
      <!-- 可多个<item>项目-->           //一个channel有多个item
      </item>
    </channel>
    </rss>

可以看到这个是RSS的基本定义,可以看到这里面定义的前三行为 title、description、link ,
后面是每一个item定义项。

有的网站提供了RSS自动发现机制,可以很方便地把RSS的URL添加到RSS阅读器中。如果没有自动发现,那么可以手动把RSS链接的URL添加到RSS阅读器中,这样就加入了一个用户订阅的频道。在RSS阅读器中可以更新频道列表或点击一个item链接打开该item的页面。

RSS工作机制

内容提供者在其网站上添加RSS的链接,以提供RSS订阅功能,当打开这个链接时,传送过去了一些频道信息,比如:blog的作者名。

一种做法是,RSS链接URL指向的是一个空内容的页面,该页面后台程序通过传过来的频道信息访问数据库,获取频道列表,用Response.Write向该空页面写出XML格式的文件。

另一种做法是,RSS链接URL指向的是一个xml文件,该文件由服务器的程序事先生成好的,放在服务器上,访问时静态获取,服务器在作者每添加一个频道列表时自动更新该xml文件。

第一种做法的优点是管理方便,因为不需要为每个频道生成xml文件,所有的RSS请求都由一个后台页面处理,接口统一,但每次访问RSS链接时,都要动态地写出RSS频道列表,访问效率相对较低,第二种做法的优点是访问时,只是返回一个静态的xml文件,不需要访问数据库来临时生成,所以访问效率相对较高,但每更新一次频道列表中的项时,就要自动地重新生成xml文件以保证RSS文件的最新,这样就降低了更新的效率。本系统中采用的是第一种方法。

django下面的实现

django自带了feed类来实现RSS,使用自带的feed非常简单,直接使用一个新的类,就可以了

    from django.contrib.syndication.views import Feed
    from django.core.urlresolvers 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])     

title, link 和 description 分别对应 RSS的 , 和 。

其中在items中可以取得所有的需要的对象,在item_title里面返回相关的标题,item_description里面返回详细内容,item_link返回拼装后的链接。

如果你要创建一个Atom feed,而不是RSS feed,你需要使用subtitle属性替代description。查看Publishing Atom and RSS feeds in tandem 里面的例子

然后在url中进行定义

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