Django の API における Syndication フィード フレームワークの概要
高水準フレームワーク
高水準フレームワークは、ビューとして実装されており、デフォルトでは /feeds/
にフックされています。Django は、URL の残りの部分 (/feeds/
以降の部分) を使用して、どのフィードを出力するかを決定します。
フィードを生成するには、以下の手順に従います。
Feed
クラスを作成します。- URLConf でそのクラスをインスタンスとして指定します。
フィードクラス
Feed
クラスは、配信フィードを表す Python クラスです。フィードは、シンプルなもの (サイトのニュースフィードなど) から、より複雑なもの (特定のカテゴリ内のすべてのブログ記事を表示するフィードなど) まで、さまざまです。
Feed
クラスは、django.contrib.syndication.views.Feed
を継承する必要があります。このクラスには、フィードのタイトル、説明、リンク、およびフィード項目のリストを返すメソッドなど、いくつかのメソッドを定義する必要があります。
URLConf でのフィードの指定
URLConf でフィードクラスを指定するには、次の行を追加します。
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}),
この行は、Django に /feeds/
で始まるすべての URL を RSS フレームワークで処理するように指示します (もちろん、feeds/
はお好みのプレフィクスに変更できます)。
上の URLConf には、{'feed_dict': feeds}
という追加の引数があります。この引数は、どの URL に対してどのクラスを使用してフィードを生成するかを配信フレームワークに伝えます。具体的には、feed_dict
は、フィードのスラッグ (短い URL ラベル) を Feed
クラスに対応付ける辞書です。
例
次の例は、最新のエントリを 5 件表示するシンプルな RSS フィードを作成する方法を示します。
from django.contrib.syndication.views import Feed
from django.core.urlresolvers import reverse
from myapp.models import Entry
class LatestEntriesFeed(Feed):
title = "My Blog's Latest Entries"
link = "/blog/"
description = "Latest entries from my blog."
def items(self):
return Entry.objects.order_by('-pub_date')[:5]
def item_title(self, item):
return item.title
def item_description(self, item):
return item.content
def item_link(self, item):
return reverse('blog_detail', args=[item.pk])
このコードを保存したら、URLConf で次の行を追加する必要があります。
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': {'latest': LatestEntriesFeed}}),
これで、/feeds/latest/
にアクセスすると、最新のエントリを 5 件表示する RSS フィードが表示されます。
低水準フレームワークは、より柔軟性と制御が必要な場合に役立ちます。このフレームワークを使用すると、フィードのすべての側面をより細かく制御できます。
from django.db import models
class Entry(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
views.py
from django.contrib.syndication.views import Feed
from django.core.urlresolvers import reverse
from myapp.models import Entry
class LatestEntriesFeed(Feed):
title = "My Blog's Latest Entries"
link = "/blog/"
description = "Latest entries from my blog."
def items(self):
return Entry.objects.order_by('-pub_date')[:5]
def item_title(self, item):
return item.title
def item_description(self, item):
return item.content
def item_link(self, item):
return reverse('blog_detail', args=[item.pk])
urls.py
from django.urls import path
from myapp.views import LatestEntriesFeed
urlpatterns = [
path('', views.index, name='index'),
path('blog/', views.blog, name='blog'),
path('blog/<int:pk>/', views.blog_detail, name='blog_detail'),
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': {'latest': LatestEntriesFeed}}),
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Blog</title>
</head>
<body>
<h1>My Blog</h1>
<ul>
{% for entry in entries %}
<li>
<a href="{% url 'blog_detail' entry.pk %}">{{ entry.title }}</a>
<p>{{ entry.pub_date }}</p>
<p>{{ entry.content }}</p>
</li>
{% endfor %}
</ul>
</body>
</html>
blog_detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ entry.title }}</title>
</head>
<body>
<h1>{{ entry.title }}</h1>
<p>{{ entry.pub_date }}</p>
<p>{{ entry.content }}</p>
</body>
</html>
このコードを実行すると、次のようになります。
/
にアクセスすると、最新のブログエントリのリストが表示されます。/blog/<int:pk>
にアクセスすると、特定のブログエントリが表示されます。
Django の Syndication フィード フレームワークの代替手段
Antenna
Antenna は、オープンソースで軽量な Python パッケージであり、RSS、Atom、JSON フィードを簡単に生成できます。 Django と統合するように設計されており、Syndication フィード フレームワークよりも柔軟でカスタマイズしやすいという利点があります。
Feedparser
Feedparser は、もう 1 つのオープンソース Python パッケージであり、さまざまなソースからの RSS と Atom フィードを解析できます。 フィードを生成するだけでなく、既存のフィードからデータを抽出するのにも使用できます。
Beautiful Soup
Beautiful Soup は、HTML と XML を解析するための Python ライブラリです。 フィードを生成するために直接使用することはできませんが、既存のフィードからデータを抽出するのに役立ちます。
カスタム XML または JSON 生成
フィードに非常に具体的な要件がある場合は、独自の XML または JSON を生成することを検討できます。 これは、他のオプションよりも多くの制御と柔軟性を提供しますが、より多くの作業も必要になります。
Syndication フィード フレームワークの代替手段を選択する際には、次の要素を考慮する必要があります。
- 必要な機能: どのようなフィードを生成する必要がありますか? どのようなカスタマイズオプションが必要ですか?
- 使いやすさ: 使いやすいパッケージを探していますか? それとも、より多くの制御と柔軟性を備えたものですか?
- コミュニティとサポート: 問題が発生した場合、どのくらいのサポートが必要ですか?