]> Panopticon :: Django :: DjangoでRSSリーダーを作る(1)

<< さくらにDjangoをインストールmemo | main | DjangoでRSSリーダーを作る(2) 解決編? >>

DjangoでRSSリーダーを作る(1)

ありがちですが作ってみます。

流れとしては

プロジェクト作成

wwwの下に作ると閲覧者に設定ファイルなどが見えてしまうので避けたほうが良い。

$ django-admin.py startproject PROJECTNAME

アプリケーションの作成

上で作ったフォルダに移動して

$ python manage.py startapp APPLICATIONNAME

settings.pyに追加

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'PROJECTNAME.APPRICATIONNAME',
)

Model, View, Controllerをそれぞれ設計して、

$ python manage.py syncdb

作ってみる

必要最低限の機能を考えて、タイトル、RSSのURI、最終閲覧日を属性とすることにする。RSSは入力必須。タイトルは任意で、空欄であればRSSからタイトルを取得して埋める。最終閲覧日にはとりあえず登録日を入れておく。

from django.db import models

# Create your models here.
class Site(models.Model):
        title = models.CharField(blank=True, maxlength=100)
        rss = models.URLField(blank=False, verify_exists=True, maxlength=100)
        last = models.DateTimeField(auto_now_add=True)

        def __str__(self):
                return self.rss
        class Admin:
                list_display = ('title', 'rss', 'last')

FeedParser

RSSからタイトルを取得するには、FeedParserを使うと、

self.title = feedparser.parse(self.rss).feed.title

一発でタイトルが取得できる。

$ wget http://downloads.sourceforge.net/feedparser/feedparser-4.1.zip
$ unzip feedparser-4.1.zip
$ python setup.py install
$ mv feedparser.py /home/USERNAME/local/lib/python

さくらの場合共有ディレクトリにファイルを置こうとしてエラーが出るので、Djangoをインストールする際に作成したPYTHONPATHの通ったフォルダに置いておく。

save()をオーバーライド

入力に応じて処理を振り分けたいときには、save()をオーバーライドすればいいようだ。

from django.db import models
import feedparser

# Create your models here.
class Site(models.Model):
        title = models.CharField(blank=True, maxlength=100)
        rss = models.URLField(blank=False, verify_exists=True, maxlength=100)
        last = models.DateTimeField(auto_now_add=True)

        def save(self):
                if not self.title:
                        self.title = feedparser.parse(self.rss).feed.title
                models.Model.save(self)

        def __str__(self):
                return self.rss
        class Admin:
                list_display = ('title', 'rss', 'last')

これでいけるかと思ったがRSSから日本語の含まれるタイトルを取得したときエンコードエラーが出る。デフォルトのエンコーディングがASCIIになっているからなのか。

/home/USERNAME/local/lib/python/site-packages/sitecustomize.pyを作成し

import sys
sys.setdefaultencoding('utf-8')

これでも直らない。どうやらMySQLdbが悪さをしているようだ。解決方法としてはMySQLdbのソースを書き換えるか、sqlobject.dburiを正しく設定してやればいいらしい。ちょっと目が疲れたのでこれは明日。

あと入力されたURIがRSSのものでない場合にはエラー画面を出したい。これもやり方を調べなくては。

カテゴリ

Trackback URI

http://www.panopticon.jp/mt/mt-tb.cgi/65

Trackbacks(0)

Comments(2)

こんにちは

databaseを作るときにdefault character set utf 8はされてますか?
またsave()メソッドのオーバーライドは

super(Site, self).save()

でなく
models.Model.save(self)
で上手くいきますか??

sin :

ありがとうございます。
データベースにつきましては、レンタルサーバーで用意されたものを使用しているため、作成や設定など自由がきかないんですよね。
MySQLのバージョンが4.0.27のためか、SET CHARSET SET... やSET NAMES... での文字コード指定も通りません。
もう少し調べてみて解決しないようでしたらデータベースを設置しなおそうと考えています。

models.Model.save(self)でも保存はされているようです。
上の書式を使うべきなんですね。
直しておきます。

コメントする