亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

用Python的Django框架來制作一個RSS閱讀器

2020-01-04 18:00:09
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了用Python的Django框架來制作一個RSS閱讀器,通過url feeds來制作訂閱類應用同樣是Django之所長,需要的朋友可以參考下
 

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:
 

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

這一行告訴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:
 

  1. from django.conf.urls.defaults import * 
  2. from mysite.feeds import LatestEntries, LatestEntriesByCategory 
  3.  
  4. feeds = { 
  5.   'latest': LatestEntries, 
  6.   'categories': LatestEntriesByCategory, 
  7.  
  8. urlpatterns = patterns(''
  9.   # ... 
  10.   (r'^feeds/(?P<url>.*)/$''django.contrib.syndication.views.feed'
  11.     {'feed_dict': feeds}), 
  12.   # ... 
?

前面的例子注冊了兩個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
 

  1. This simple example describes a feed of the latest five blog entries for a given blog: 
  2.  
  3. from django.contrib.syndication.feeds import Feed 
  4. from mysite.blog.models import Entry 
  5.  
  6. class LatestEntries(Feed): 
  7.   title = "My Blog" 
  8.   link = "/archive/" 
  9.   description = "The latest news about stuff." 
  10.  
  11.   def items(self): 
  12.     return Entry.objects.order_by('-pub_date')[:5] 
?

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

  •     子類 django.contrib.syndication.feeds.Feed .
  •     title , link , 和 description 對應一個標準 RSS 里的 <title> , <link> , 和 <description> 標簽.
  •     items() 是一個方法,返回一個用以包含在包含在feed的 <item> 元素里的 list 雖然例子里用Djangos database API返回的 NewsItem 對象, items() 不一定必須返回 model的實例 Although this example returns Entry objects using Django's database API, items() doesn't have to return model instances.

還有一個步驟,在一個RSS feed里,每個(item)有一個(title),(link)和(description),我們需要告訴框架 把數據放到這些元素中 In an RSS feed, each <item> has a <title> , <link> , and <description> . We need to tell the framework what data to put into those elements.

    如果要指定 <title> 和 <description> ,可以建立一個Django模板(見Chapter 4)名字叫 feeds/latest_title.html 和 feeds/latest_description.html ,后者是URLConf里為對應feed指定的 slug 。注意 .html 后綴是必須的。 Note that the .html extension is required.

    RSS系統模板渲染每一個條目,需要給傳遞2個參數給模板上下文變量:

  1.         obj : 當前對象 ( 返回到 items() 任意對象之一 )。
  2.         site : 一個表示當前站點的 django.models.core.sites.Site 對象。 這對于 {{ site.domain }} 或者 {{ site.name }} 很有用。

    如果你在創建模板的時候,沒有指明標題或者描述信息,框架會默認使用 "{{ obj }}" ,對象的字符串表示。 (For model objects, this will be the __unicode__() method.

    你也可以通過修改 Feed 類中的兩個屬性 title_template 和 description_template 來改變這兩個模板的名字。

    你有兩種方法來指定 <link> 的內容。 Django 首先執行 items() 中每一項的 get_absolute_url() 方法。 如果該方法不存在,就會嘗試執行 Feed 類中的 item_link() 方法,并將自身作為 item 參數傳遞進去。

    get_absolute_url() 和 item_link() 都應該以Python字符串形式返回URL。

    對于前面提到的 LatestEntries 例子,我們可以實現一個簡單的feed模板。 latest_title.html 包括:

{{ obj.title }}

    并且 latest_description.html 包含:

{{ obj.description }}

    這真是 太 簡單了!

一個更復雜的Feed

框架通過參數支持更加復雜的feeds。

For example, say your blog offers an RSS feed for every distinct tag you've used to categorize your entries. 如果為每一個單獨的區域建立一個 Feed 類就顯得很不明智。

取而代之的方法是,使用聚合框架來產生一個通用的源,使其可以根據feeds URL返回相應的信息。

Your tag-specific feeds could use URLs like this:

    http://example.com/feeds/tags/python/ : Returns recent entries tagged with python

    http://example.com/feeds/tags/cats/ : Returns recent entries tagged with cats

固定的那一部分是 "beats" (區域)。

舉個例子會澄清一切。 下面是每個地區特定的feeds:
 

  1. from django.core.exceptions import ObjectDoesNotExist 
  2. from mysite.blog.models import Entry, Tag 
  3.  
  4. class TagFeed(Feed): 
  5.   def get_object(self, bits): 
  6.     # In case of "/feeds/tags/cats/dogs/mice/", or other such 
  7.     # clutter, check that bits has only one member. 
  8.     if len(bits) != 1: 
  9.       raise ObjectDoesNotExist 
  10.     return Tag.objects.get(tag=bits[0]) 
  11.  
  12.   def title(self, obj): 
  13.     return "My Blog: Entries tagged with %s" % obj.tag 
  14.  
  15.   def link(self, obj): 
  16.     return obj.get_absolute_url() 
  17.  
  18.   def description(self, obj): 
  19.     return "Entries tagged with %s" % obj.tag 
  20.  
  21.   def items(self, obj): 
  22.     entries = Entry.objects.filter(tags__id__exact=obj.id) 
  23.     return entries.order_by('-pub_date')[:30] 
?

以下是RSS框架的基本算法,我們假設通過URL /rss/beats/0613/ 來訪問這個類:

    框架獲得了URL /rss/beats/0613/ 并且注意到URL中的slug部分后面含有更多的信息。 它將斜杠("/" )作為分隔符,把剩余的字符串分割開作為參數,調用 Feed 類的 get_object() 方法。

    在這個例子中,添加的信息是 ['0613'] 。對于 /rss/beats/0613/foo/bar/ 的一個URL請求, 這些信息就是 ['0613', 'foo', 'bar'] 。

    get_object() 就根據給定的 bits 值來返回區域信息。

    In this case, it uses the Django database API to retrieve the Tag . Note that get_object() should raise django.core.exceptions.ObjectDoesNotExist if given invalid parameters. 在 Beat.objects.get() 調用中也沒有出現 try /except 代碼塊。 函數在出錯時拋出 Beat.DoesNotExist 異常,而 Beat.DoesNotExist 是 ObjectDoesNotExist 異常的一個子類型。

    為產生 <title> , <link> , 和 <description> 的feeds, Django使用 title() , link() , 和 description() 方法。 在上面的例子中,它們都是簡單的字符串類型的類屬性,而這個例子表明,它們既可以是字符串, 也可以是 方法。 對于每一個 title , link 和 description 的組合,Django使用以下的算法:

        試圖調用一個函數,并且以 get_object() 返回的對象作為參數傳遞給 obj 參數。

        如果沒有成功,則不帶參數調用一個方法。

        還不成功,則使用類屬性。

    最后,值得注意的是,這個例子中的 items() 使用 obj 參數。 對于 items 的算法就如同上面第一步所描述的那樣,首先嘗試 items(obj) , 然后是 items() ,最后是 items 類屬性(必須是一個列表)。

Feed 類所有方法和屬性的完整文檔,請參考官方的Django文檔 (http://www.djangoproject.com/documentation/0.96/syndication_feeds/) 。
指定Feed的類型

默認情況下, 聚合框架生成RSS 2.0. 要改變這樣的情況, 在 Feed 類中添加一個 feed_type 屬性. To change that, add a feed_type attribute to your Feed class:
 

  1. from django.utils.feedgenerator import Atom1Feed 
  2.  
  3. class MyFeed(Feed): 
  4.   feed_type = Atom1Feed 
?

注意你把 feed_type 賦值成一個類對象,而不是類實例。 目前合法的Feed類型如表所示。

用Python的Django框架來制作一個RSS閱讀器

 

閉包

為了指定閉包(例如,與feed項比方說MP3 feeds相關聯的媒體資源信息),使用 item_enclosure_url , item_enclosure_length , 以及 item_enclosure_mime_type ,比如
 

  1. from myproject.models import Song 
  2.  
  3. class MyFeedWithEnclosures(Feed): 
  4.   title = "Example feed with enclosures" 
  5.   link = "/feeds/example-with-enclosures/" 
  6.  
  7.   def items(self): 
  8.     return Song.objects.all()[:30] 
  9.  
  10.   def item_enclosure_url(self, item): 
  11.     return item.song_url 
  12.  
  13.   def item_enclosure_length(self, item): 
  14.     return item.song_length 
  15.  
  16.   item_enclosure_mime_type = "audio/mpeg" 
?

當然,你首先要創建一個包含有 song_url 和 song_length (比如按照字節計算的長度)域的 Song 對象。
語言

聚合框架自動創建的Feed包含適當的 <language> 標簽(RSS 2.0) 或 xml:lang 屬性(Atom). 他直接來自于您的 LANGUAGE_CODE 設置. This comes directly from your LANGUAGE_CODE setting.
URLs

link 方法/屬性可以以絕對URL的形式(例如, "/blog/" )或者指定協議和域名的URL的形式返回(例如 "http://www.example.com/blog/" )。如果 link 沒有返回域名,聚合框架會根據 SITE_ID 設置,自動的插入當前站點的域信息。 (See Chapter 16 for more on SITE_ID and the sites framework.)

Atom feeds需要 <link rel="self"> 指明feeds現在的位置。 The syndication framework populates this automatically.
同時發布Atom and RSS

一些開發人員想 同時 支持Atom和RSS。 這在Django中很容易實現: 只需創建一個你的 feed 類的子類,然后修改 feed_type ,并且更新URLconf內容。 下面是一個完整的例子: Here's a full example:
 

  1. from django.contrib.syndication.feeds import Feed 
  2. from django.utils.feedgenerator import Atom1Feed 
  3. from mysite.blog.models import Entry 
  4.  
  5. class RssLatestEntries(Feed): 
  6.   title = "My Blog" 
  7.   link = "/archive/" 
  8.   description = "The latest news about stuff." 
  9.  
  10.   def items(self): 
  11.     return Entry.objects.order_by('-pub_date')[:5] 
  12.  
  13. class AtomLatestEntries(RssLatestEntries): 
  14.   feed_type = Atom1Feed 
?

這是與之相對應那個的URLconf:
 

  1. from django.conf.urls.defaults import * 
  2. from myproject.feeds import RssLatestEntries, AtomLatestEntries 
  3.  
  4. feeds = { 
  5.   'rss': RssLatestEntries, 
  6.   'atom': AtomLatestEntries, 
  7.  
  8. urlpatterns = patterns(''
  9.   # ... 
  10.   (r'^feeds/(?P<url>.*)/$''django.contrib.syndication.views.feed'
  11.     {'feed_dict': feeds}), 
  12.   # ... 
?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品扒开腿做爽爽爽视频| 91国内产香蕉| 久久久极品av| 91色琪琪电影亚洲精品久久| 国产精品欧美亚洲777777| 成人欧美一区二区三区在线| 精品高清一区二区三区| 亚洲美女在线观看| 国产一区二区三区在线免费观看| 欧美午夜女人视频在线| 91色视频在线观看| 成人h视频在线| 91久久久亚洲精品| 午夜精品久久久久久99热| 久久亚洲精品小早川怜子66| 日韩在线视频观看| 国产亚洲成av人片在线观看桃| 国产z一区二区三区| 国产精品91免费在线| 国产精品第8页| 国产精品久久久精品| 欧美亚洲国产精品| 欧美激情网友自拍| 国产综合福利在线| 久久国产精品久久精品| 亚洲国产91精品在线观看| 亚洲午夜国产成人av电影男同| 97av在线视频| 欧美性xxxx极品hd满灌| 国产日韩在线视频| 成人免费视频网址| 欧美精品免费在线观看| 精品亚洲国产视频| 亚洲欧美在线播放| 精品亚洲一区二区三区在线播放| 欧美日韩免费在线| 97视频com| 5252色成人免费视频| 久久精品国产综合| 久久精品一区中文字幕| 欧美疯狂性受xxxxx另类| 亚洲毛片在线观看| 中文综合在线观看| 狠狠操狠狠色综合网| 国产精品男女猛烈高潮激情| 欧美在线视频网| 北条麻妃在线一区二区| 日本一区二区三区在线播放| 欧美激情免费看| 国产欧美日韩综合精品| 91精品国产高清久久久久久91| 91在线免费看网站| 久久理论片午夜琪琪电影网| 久久久国产视频91| 亚洲a区在线视频| 亚洲色图欧美制服丝袜另类第一页| 色综合久久88色综合天天看泰| 精品丝袜一区二区三区| 久久国产精品电影| 久久久精品免费视频| 国产偷国产偷亚洲清高网站| 欧美性极品少妇精品网站| 久久精品最新地址| 日韩麻豆第一页| 国产激情综合五月久久| 欧美一级黑人aaaaaaa做受| 亚洲视屏在线播放| 亚洲男人第一网站| 国产一区二区三区精品久久久| 国产精品高潮呻吟久久av黑人| 亚洲激情第一页| 欧美高清视频免费观看| 国产成人精品久久亚洲高清不卡| 91视频国产高清| 久久久伊人日本| 亚洲激情视频在线观看| 日韩经典中文字幕| 亚洲精品自拍偷拍| 日韩一区二区三区在线播放| 97视频免费观看| 久久久在线视频| 国产精品人成电影在线观看| 国产精品免费小视频| 日韩精品中文字幕视频在线| 欧美日韩美女在线观看| 亚洲精品国产欧美| 亚洲大胆人体av| 欧美大片网站在线观看| 国产精品久久久久91| 人九九综合九九宗合| 欧美一级在线播放| 久久精品亚洲国产| 青青青国产精品一区二区| 91高清免费在线观看| 91chinesevideo永久地址| www日韩中文字幕在线看| 91香蕉嫩草神马影院在线观看| 亚洲一区中文字幕在线观看| 久久青草精品视频免费观看| 中文字幕亚洲在线| 国产欧美一区二区三区在线看| 国产自产女人91一区在线观看| 日韩视频中文字幕| 久久久久成人精品| 国产婷婷色综合av蜜臀av| 懂色av影视一区二区三区| 日韩电影免费在线观看中文字幕| 日韩成人中文字幕在线观看| 国产精品视频自在线| 亚洲精品wwwww| 88xx成人精品| 久久国产精品久久国产精品| xvideos亚洲人网站| 色与欲影视天天看综合网| 国模私拍视频一区| 亚洲国产精品久久| 日韩在线免费视频| 最新国产成人av网站网址麻豆| 在线视频免费一区二区| 亚洲国产成人久久综合一区| 亚洲欧洲午夜一线一品| 2019av中文字幕| 国产精品久久婷婷六月丁香| 欧美一级黑人aaaaaaa做受| 777午夜精品福利在线观看| 亚洲成人久久一区| 国产欧美精品在线播放| 国产精品成久久久久三级| 亚洲国产成人av在线| 日韩毛片中文字幕| 中文欧美在线视频| 国产日韩综合一区二区性色av| 成人福利在线视频| 亚洲人在线视频| 色综合色综合网色综合| 欧美在线视频导航| 亚洲深夜福利在线| 久久久www成人免费精品| 国产日韩欧美在线视频观看| 亚洲午夜av电影| 欧美亚洲日本黄色| 国产免费观看久久黄| 亚洲美女在线观看| 亚洲成av人片在线观看香蕉| 国产精品免费视频xxxx| 成人xvideos免费视频| 欧美极品少妇全裸体| 91av在线免费观看视频| 日韩成人黄色av| 欧美一区二区三区四区在线| 久热在线中文字幕色999舞| 亚洲欧美日韩图片| 国产欧美一区二区三区久久人妖| 狠狠做深爱婷婷久久综合一区| 日韩a**站在线观看| 国产精品欧美日韩一区二区| 国产精品成人aaaaa网站| 在线看欧美日韩| 精品国产一区久久久| 一区二区欧美在线| 欧美日韩另类视频| 在线视频欧美日韩精品| 日本欧美精品在线| 亚洲综合日韩中文字幕v在线|