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()),
# ...
]