]>
<< さくらにDjangoをインストールmemo | main | DjangoでRSSリーダーを作る(2) 解決編? >>
ありがちですが作ってみます。
流れとしては
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')
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()をオーバーライドすればいいようだ。
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のものでない場合にはエラー画面を出したい。これもやり方を調べなくては。
http://www.panopticon.jp/mt/mt-tb.cgi/65
こんにちは
databaseを作るときにdefault character set utf 8はされてますか?
またsave()メソッドのオーバーライドは
super(Site, self).save()
でなく
models.Model.save(self)
で上手くいきますか??
ありがとうございます。
データベースにつきましては、レンタルサーバーで用意されたものを使用しているため、作成や設定など自由がきかないんですよね。
MySQLのバージョンが4.0.27のためか、SET CHARSET SET... やSET NAMES... での文字コード指定も通りません。
もう少し調べてみて解決しないようでしたらデータベースを設置しなおそうと考えています。
models.Model.save(self)でも保存はされているようです。
上の書式を使うべきなんですね。
直しておきます。