Membuat Feed RSS dan Atom pada Django 2

833

Membuat RSS dan Atom feed pada Django cukup mudah. Kita tinggal menentukan model apa yang akan dijadikan syndication feed dan menambahkan URL.

Perhatikan, kita sebaiknya teliti memilih field/method model kita yang digunakan pada kelas Feed. Isi berita (pada contoh saya) mungkin terlalu panjang, bisa diganti ringkasan berita atau semacamnya.

Buat file baru pada direktori app bernama feeds.py.

from django.contrib.syndication.views import Feed
from django.utils.feedgenerator import Atom1Feed
from nama_app.models import Berita
from markdownx.utils import markdownify
import datetime

class RssLatestArticlesFeed(Feed):
    title = "Judul Feed"
    link = '/'
    description = "Berita terbaru untuk pembaca."
    author_name = 'Pemilik Blog'
    author_email = 'email@email.com'
    feed_copyright = f'Copyright (c) {datetime.datetime.now().year}'

    def items(self):
        return Berita.objects.filter(published=True)[:10000]

    def item_title(self, item):
        return item.title

    def item_description(self, item):
        return markdownify(item.content)

    def item_updateddate(self, item):
        return item.date_created

class AtomLatestArticlesFeed(RssLatestArticlesFeed):
    feed_type = Atom1Feed
    subtitle = RssLatestArticlesFeed.description

Pada contoh di atas, feed Atom adalah child dari RSS. Sederhana bukan? Semua field dan method pada kelas Feed di atas juga sebaiknya disertakan pada implementasi masing-masing. (Saya menggunakan markdownify() karena saya menyimpan konten dengan format markdown.)

Jangan lupa, dalam contoh ini, title, content, dan date_created adalah field yang valid pada model yang digunakan (Berita).

Di urls.py di direktori proyek, tambahkan ini:

from nama_app.feeds import AtomLatestArticlesFeed, RssLatestArticlesFeed

urlpatterns = [
    # .. dan lain-lain ..
    path('feed/atom/', AtomLatestArticlesFeed(), name='articles-atom'),
    path('feed/rss/', RssLatestArticlesFeed(), name='articles-rss'),
    # ...
]

Contoh pada Atom feed blog saya.

Referensi

  1. The syndication feed framework
  2. Dukungan PubSubHubbub untuk Django