真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用Django怎么實現(xiàn)RSS功能-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)使用Django怎么實現(xiàn)RSS功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為曲周企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站建設(shè),曲周網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

RSS 簡介

RSS(Really Simple Syndication)是一種描述和同步網(wǎng)站內(nèi)容的格式,它采用 XML 作為內(nèi)容傳遞的格式。簡單來說就是網(wǎng)站可以把內(nèi)容包裝成符合 RSS 標(biāo)準(zhǔn)的 XML 格式文檔。一旦網(wǎng)站內(nèi)容符合一個統(tǒng)一的規(guī)范,那么人們就可以開發(fā)一種讀取這種規(guī)范化的 XML 文檔的工具來聚合各大網(wǎng)站的內(nèi)容。例如一個讀者可能關(guān)注了很多的博客網(wǎng)站,如果這些博客網(wǎng)站都支持 RSS 訂閱的話,他就只需要一個聚合閱讀器訂閱這些博客,就可以在聚合器工具里看到全部博客的更新內(nèi)容,而不必再分別訪問各個博客去看有沒有內(nèi)容更新了。更多 RSS 的介紹,可參考rss (簡易信息聚合)。

使用 Django Feed 類

根據(jù)以上對 RSS 的介紹,我們可以發(fā)現(xiàn)關(guān)鍵的地方就是根據(jù)網(wǎng)站的內(nèi)容生成規(guī)范化的 XML 文檔,幸運的是,Django 已經(jīng)內(nèi)置了一些生成這個文檔的方法,下面就使用這些方法來創(chuàng)建 RSS 訂閱文檔。

首先我們在 blog 應(yīng)用的根目錄下(models.py 所在目錄)新建一個 feeds.py 文件以存放和 RSS 功能相關(guān)的代碼。讓后在 feeds.py 中寫入如下代碼:

blog/feeds.py

from django.contrib.syndication.views import Feed

from .models import Post


class AllPostsRssFeed(Feed):
  # 顯示在聚合閱讀器上的標(biāo)題
  title = "HelloDjango-blog-tutorial"

  # 通過聚合閱讀器跳轉(zhuǎn)到網(wǎng)站的地址
  link = "/"

  # 顯示在聚合閱讀器上的描述信息
  description = "HelloDjango-blog-tutorial 全部文章"

  # 需要顯示的內(nèi)容條目
  def items(self):
    return Post.objects.all()

  # 聚合器中顯示的內(nèi)容條目的標(biāo)題
  def item_title(self, item):
    return "[%s] %s" % (item.category, item.title)

  # 聚合器中顯示的內(nèi)容條目的描述
  def item_description(self, item):
    return item.body_html

代碼應(yīng)該不難理解,主要就是指定要生成的 XML 文檔內(nèi)容。各個屬性和方法的含義已在代碼中注釋,你只需把相關(guān)的內(nèi)容替換成符合你博客的描述即可。

需要注意一點的是這個方法:

  # 聚合器中顯示的內(nèi)容條目的描述
  def item_description(self, item):
    return item.body_html

item 是文章 (Post 模型的實例),聚合內(nèi)容的描述我們返回了 body_html 屬性的值。模型中原本使用 body 屬性存儲博客文章的內(nèi)容,但是這些內(nèi)容是以 Markdown 格式的,并非所有的聚合內(nèi)容閱讀器都支持 Markdown 格式的解析,因此我們返回的是已經(jīng)解析后的 HTML 格式內(nèi)容。

但 Post 模型原來并沒有 body_html 這個屬性的,那它是哪里來的呢?

回顧一下 PostDetailView 這個視圖,我們在獲取博客文章 post 的詳細(xì)內(nèi)容的視圖中,使用 markdown 這個 Python 庫在解析 post.body 這個屬性的值。這個解析的過程其實在很多地方都可能用到,不應(yīng)該寫死在 PostDetailView 這個視圖里,所以我們先將 PostDetailView 視圖的 get_object 方法解析 Markdown 內(nèi)容的過程封裝為一個函數(shù),暫且將其放在 blog/models.py 中。

blog/models.py

def generate_rich_content(value):
  md = markdown.Markdown(
    extensions=[
      "markdown.extensions.extra",
      "markdown.extensions.codehilite",
      # 記得在頂部引入 TocExtension 和 slugify
      TocExtension(slugify=slugify),
    ]
  )
  content = md.convert(value)
  m = re.search(r'\s*
    (.*)
\s*
', md.toc, re.S)   toc = m.group(1) if m is not None else ""   return {"content": content, "toc": toc}

解析過程和原來一樣,只是將解析得到的 HTML 內(nèi)容(content)和目錄(toc)放在一個字典里返回。

然后,我們來給 Post 模型定義幾個屬性,以便方便地獲取解析后的內(nèi)容和目錄:

blog/models.py

from django.utils.functional import cached_property

class Post(models.Model):
  # 省略其它代碼
  
  @property
  def toc(self):
    return self.rich_content.get("toc", "")

  @property
  def body_html(self):
    return self.rich_content.get("content", "")

  @cached_property
  def rich_content(self):
    return generate_rich_content(self.body)

首先看到 rich_content 這個方法,它返回的是 generate_rich_content 函數(shù)調(diào)用后的結(jié)果,即將 body 屬性的值經(jīng) Markdown 解析后的內(nèi)容。但要注意的是我們使用了 django 提供的 cached_property 裝飾器,這個裝飾器和 Python 內(nèi)置的 property 裝飾器功能一樣,可以將方法轉(zhuǎn)為屬性,這樣就能夠以屬性訪問的方式獲取方法返回的值,不過 cached_property 進(jìn)一步提供緩存功能,它將被裝飾方法調(diào)用返回的值緩存起來,下次訪問時將直接讀取緩存內(nèi)容,而不需重復(fù)執(zhí)行方法獲取返回結(jié)果。例如對博客文章內(nèi)容的 Markdown 解析是比較耗時的,而解析的結(jié)果可能被多次訪問,因此將其緩存起來能起到優(yōu)化作用。

為了更方便地獲取文章的 HTML 格式的內(nèi)容和目錄,我們進(jìn)一步將 generate_rich_content 返回的值放到 toc 和 body_html 兩個屬性中,這里兩個屬性都從 rich_content 中取值,cached_property 的作用就發(fā)揮出來了。

添加 URL

接下來就是指定 URL 模式,讓人們訪問這個 URL 后就可以看到 Feed 生成的內(nèi)容。通常 RSS 的 URL 配置直接寫在項目的 urls.py 文件里,即打開 blogproject/urls.py 文件,添加如下代碼:

blogproject/urls.py

from blog.feeds import AllPostsRssFeed

urlpatterns = [
  path('admin/', admin.site.urls),
  path('', include('blog.urls')),
  path('', include('comments.urls')),

  # 記得在頂部引入 AllPostsRssFeed
  path('all/rss/', AllPostsRssFeed(), name='rss'),
]

修改模板

簡單修改一下 templates/base.html 模板,把 RSS 的 URL 添加到模板中:


   RSS 訂閱

此外,由于將 Markdown 解析的內(nèi)容放在了 body_html 屬性,將之前博客文章詳情模板里獲取文章內(nèi)容的代碼也做相應(yīng)調(diào)整:

templates/blog/detail.html


  {{ post.body_html|safe }}

關(guān)于使用Django怎么實現(xiàn)RSS功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


當(dāng)前標(biāo)題:使用Django怎么實現(xiàn)RSS功能-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://weahome.cn/article/dccidj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部