Django で RSS/Atom フィードを簡単に生成: Syndication フィード フレームワーク

2024-06-21

Django の API における Syndication フィード フレームワークの概要

高水準フレームワークは、ビューとして実装されており、デフォルトでは /feeds/ にフックされています。Django は、URL の残りの部分 (/feeds/ 以降の部分) を使用して、どのフィードを出力するかを決定します。

フィードを生成するには、以下の手順に従います。

  1. Feed クラスを作成します。
  2. URLConf でそのクラスをインスタンスとして指定します。

フィードクラス

Feed クラスは、配信フィードを表す Python クラスです。フィードは、シンプルなもの (サイトのニュースフィードなど) から、より複雑なもの (特定のカテゴリ内のすべてのブログ記事を表示するフィードなど) まで、さまざまです。

Feed クラスは、django.contrib.syndication.views.Feed を継承する必要があります。このクラスには、フィードのタイトル、説明、リンク、およびフィード項目のリストを返すメソッドなど、いくつかのメソッドを定義する必要があります。

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 フィードが表示されます。

低水準フレームワークは、より柔軟性と制御が必要な場合に役立ちます。このフレームワークを使用すると、フィードのすべての側面をより細かく制御できます。

低水準フレームワークの詳細については、Django のドキュメントを参照してください: https://docs.djangoproject.com/en/5.0/ref/contrib/syndication/

Django の配信フィードフレームワークは、RSS と Atom フィードを簡単に生成するための強力なツールです。高水準フレームワークと低水準フレームワークの両方が用意されているため、ニーズに合ったものを選択できます。



models.py

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>

このコードを実行すると、次のようになります。

  • / にアクセスすると、最新のブログエントリのリストが表示されます。


Django の Syndication フィード フレームワークの代替手段

Antenna は、オープンソースで軽量な Python パッケージであり、RSS、Atom、JSON フィードを簡単に生成できます。 Django と統合するように設計されており、Syndication フィード フレームワークよりも柔軟でカスタマイズしやすいという利点があります。

https://github.com/topics/antenna-design

Feedparser は、もう 1 つのオープンソース Python パッケージであり、さまざまなソースからの RSS と Atom フィードを解析できます。 フィードを生成するだけでなく、既存のフィードからデータを抽出するのにも使用できます。

https://github.com/kurtmckee/feedparser

Beautiful Soup は、HTML と XML を解析するための Python ライブラリです。 フィードを生成するために直接使用することはできませんが、既存のフィードからデータを抽出するのに役立ちます。

https://beautiful-soup-4.readthedocs.io/en/latest/

カスタム XML または JSON 生成

フィードに非常に具体的な要件がある場合は、独自の XML または JSON を生成することを検討できます。 これは、他のオプションよりも多くの制御と柔軟性を提供しますが、より多くの作業も必要になります。

Syndication フィード フレームワークの代替手段を選択する際には、次の要素を考慮する必要があります。

  • 必要な機能: どのようなフィードを生成する必要がありますか? どのようなカスタマイズオプションが必要ですか?
  • 使いやすさ: 使いやすいパッケージを探していますか? それとも、より多くの制御と柔軟性を備えたものですか?
  • コミュニティとサポート: 問題が発生した場合、どのくらいのサポートが必要ですか?

最適なオプションは、特定のニーズによって異なります。 上記のオプションを調査し、ニーズに合ったものを選択してください。