用Python的Django框架来制作一个RSS阅读器

1283次阅读  |  发布于5年以前

Django带来了一个高级的聚合生成框架,它使得创建RSS和Atom feeds变得非常容易。

什么是RSS? 什么是Atom?

RSS和Atom都是基于XML的格式,你可以用它来提供有关你站点内容的自动更新的feed。 了解更多关于RSS的可以访问 http://www.whatisrss.com/, 更多Atom的信息可以访问 http://www.atomenabled.org/.

想创建一个联合供稿的源(syndication feed),所需要做的只是写一个简短的python类。 你可以创建任意多的源(feed)。

高级feed生成框架是一个默认绑定到/feeds/的视图,Django使用URL的其它部分(在/feeds/之后的任何东西)来决定输出 哪个feed Django uses the remainder of the URL (everything after /feeds/ ) to determine which feed to return.

要创建一个 sitemap,你只需要写一个 Sitemap 类然后配置你的URLconf指向它。
初始化

为了在您的Django站点中激活syndication feeds, 添加如下的 URLconf:


    (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',
      {'feed_dict': feeds}
    ),

这一行告诉Django使用RSS框架处理所有的以 "feeds/" 开头的URL. ( 你可以修改 "feeds/" 前缀以满足您自己的要求. )

URLConf里有一行参数: {'feed_dict': feeds},这个参数可以把对应URL需要发布的feed内容传递给 syndication framework

特别的,feed_dict应该是一个映射feed的slug(简短URL标签)到它的Feed类的字典 你可以在URL配置本身里定义feed_dict,这里是一个完整的例子 You can define the feed_dict in the URLconf itself. Here's a full example URLconf:


    from django.conf.urls.defaults import *
    from mysite.feeds import LatestEntries, LatestEntriesByCategory

    feeds = {
      'latest': LatestEntries,
      'categories': LatestEntriesByCategory,
    }

    urlpatterns = patterns('',
      # ...
      (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',
        {'feed_dict': feeds}),
      # ...
    )

前面的例子注册了两个feed:

  1. LatestEntries``表示的内容将对应到``feeds/latest/ .
  2. LatestEntriesByCategory的内容将对应到feeds/categories/ .

以上的设定完成之后,接下来需要自己定义 Feed 类

一个 Feed 类是一个简单的python类,用来表示一个syndication feed. 一个feed可能是简单的 (例如一个站点新闻feed,或者最基本的,显示一个blog的最新条目),也可能更加复杂(例如一个显示blog某一类别下所有条目的feed。 这里类别 category 是个变量).

Feed类必须继承django.contrib.syndication.feeds.Feed,它们可以在你的代码树的任何位置
一个简单的Feed


    This simple example describes a feed of the latest five blog entries for a given blog:

    from django.contrib.syndication.feeds import Feed
    from mysite.blog.models import Entry

    class LatestEntries(Feed):
      title = "My Blog"
      link = "/archive/"
      description = "The latest news about stuff."

      def items(self):
        return Entry.objects.order_by('-pub_date')[:5]

要注意的重要的事情如下所示: