ブログランキングで最新記事を取得できるようにした時の話(1)
2017/02/12 13:30
  • ブログランキングではサイトのRSSから最新記事を引っ張ってきますが、
    全然取得されなかったので頑張って取得できるようにした時の話です。

    当サイトはDjangoで完全自前実装してるので(ブログ系のアプリすらインストールしてない)
    もちろんRSSも自前で用意してます。(feeds.py)

    まず、RSSフィードを配信する仕組みを作ります。
    DjangoにはFeed配信機能が組み込まれていますので、それを利用することにします。

    1. feeds.pyの設置

    アプリケーションフォルダ直下に feeds.py を作成します。
    from .models import Article # 記事データ保持用モデル
    from django.contrib.syndication.views import Feed # フィード配信用クラス
    from django.conf import settings
    
    
    # 記事一覧のRSSフィード
    class ArticlesFeed(Feed):
        title = '4to.pics Articles'
        description_template = None
    
        # 記事リスト。直近5件だけ抽出
        def items(self):
            return Article.objects.filter(is_publish=1).order_by('-updated_at')[:5]
    
        # 記事概要。テーブルの設計が悪かったので取り急ぎ「ーーーー」をセパレータとして使いました。
        # 「続きを読む」的なアレデス。記事テーブルに`description` カラムを用意してあげたほうがシンプルです。
        def item_description(self, item):
            return item.content.split('ーーーー')[0]
    
        # setting.pyに定義したサイトのBASE_URL(http://4to.pics/)を返す
        def link(self):
            return settings.BASE_URL
    

    2. urls.pyにルーティングを追加

    アプリケーションフォルダ直下の urls.py に以下を追記します。

    ...
    from .feeds import ArticlesFeed
    ...
    urlpatterns = [
        ...
        url(r'^article/rss/$', ArticlesFeed(), name='articleFeed'),
        ...
    ]
    

    ここまでで、RSSのフィードを配信する仕組みが完成しました。簡単ですね。
    試しに curlでぶっ叩いてみます。
    $ curl -s http://4to.pics/article/rss/ 
    <?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>4to.pics Articles</title><link>http://4to.pics/</link><description></description><atom:link href="http://4to.pics/article/rss/" rel="self"></atom:link><language>ja</language><lastBuildDate>Wed, 08 Feb 2017 20:45:08 +0900</lastBuildDate><item><title>フロントエンドエンジニアと名乗っていいものか…</title><
    link>http://4to.pics/article/post/29</link><description>今回はただの日記です。
    
    3年くらい前は自信を持って「Web系のフロントエンドエンジニアです!」って名乗れたものだけど
    (さらに前はバックエンド)、
    最近はもう名乗るのもおこがましい、完全なるバックエンドエンジニアになっています。@趣味だけど
    
    もちろん、仕事でもフロントエンドはやっていますが、あくまでネイティブアプリのフロントなので
    Webではなかったりします。
    ...
    ...
    

    はい。普通に取れてますね。

    3. テンプレートにRSSのURLを設定する

    これをしてあげないと、ブラウザやブログランキン等の外部サービス
    がRSSフィードのURLを発見してくれません。(当たり前)

    例によってJade記法でごめんなさい…

    link(rel='alternate', type='application/rss+xml', href='/article/rss/', title='RSS2.0')
    

    これでRSSリーダー等で読み取れるようになりました。
    記事が長くなってしまったので今回はここまで…
    尻切れトンボでごめんなさい!

    続編すぐにUPします。m(_ _)m

    続編書きました。
    ブログランキングで最新記事を取得できるようにした時の話(1)


    ↑こちらもよろしくお願いします!

    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • <2017/02/09 11:55>
  • Python
  • RSSfeedatomblogブログrankingランキングリーダーreaderDjangoPython
  • 新しい記事へ
    Djangoでお問い合わせフォームをお手軽に実装する

    古い記事へ
    ブログランキングで最新記事を取得できるようにした時の話(2)

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。