このサイトについて

みんなのPython Webアプリ編 - RSSリーダーを作る その2

みんなのPython Webアプリ編 - RSSリーダーを作る その2

RSSリーダーを作る その2

テンプレートエンジンとO/Rマッパーという強力な2つの武器を手に入れました。この2つの仕組みを使えば、Webアプリケーションの開発がずっと効率的になります。より少ない手数で、より高機能なアプリケーションを開発できるようになるわけです。

ここでは、2つの仕組みを活用して、P.86で作ったRSSリーダーの機能強化をしてみましょう。

P.86で作ったRSSリーダーは、RSSのURLを直接打ち込み、RSSの一覧を表示する機能しか持っていませんでした。今回は、RSSを登録する機能を追加します。RSSが複数登録されていたら、複数のRSSを巡回してRSSの内容を表示するようにします。

RSSの登録や修正をするためにはユーザインターフェースが必要です。フォームを使って、RSSを新規登録したり、既存のRSSを修正するような仕組みを作るわけです。このような機能は、Webアプリケーションではとても一般的な機能です。今回は、RSSリーダーの拡張に合わせて、フォームを使って項目を登録、編集する仕組みをどのように作るかについても解説します。

RSSリーダーの機能追加

まず最初に、どのような機能追加を行うかについて決めることから始めましょう。今回目指すのは、複数RSSへの対応です。巡回するRSSを登録できるようにし、複数RSSがある場合は複数のRSSを巡回して、結果を表示します。

登録するRSSのURLなどは、テータベース(SQLite3)に保存します。O/Rマッパーの抽象クラスを継承したクラスを新たに作り、データベースに関わ

る処理に利用します。RSSを登録できるようにするためには、RSSの内容を入力し、Webアプリケーションに届けるためのUIが必要です。RSS登録用のUIには2種類あります。1つはRSSを新規に登録するためのUIです。もう1つは、登録済みのRSSを変更するためのUIです。フォームを表示するHTMLを、テンプレートエンジンを活用して作成します。Webアプリケーション側でフォームからの入力を受け取り、必要に応じて処理をします。Webアプリケーションの処理は、RSSの新規登録と既存RSSの変更という2種類が必要になります。

また、RSSの追加、変更をするとき、不正なデータが入力されたらエラーを表示して追加、登録を受け付けないようにする仕組みを作ります。このような仕組みをバリデーションチェックと呼ぶことはすでに解説しました。

図01 今回のRSSリーダーは、いくつかの画面で構成される

図01 今回のRSSリーダーは、いくつかの画面で構成される

前回作ったRSSリーダーでは、RSSのURL入力フォームと、巡回結果を表示するプログラムが1つでした。つまり、1枚の画面ですべての処理が実行できたのです。今回の拡張によって、RSSリーダー全体で複数の画面を持つことになります。図のような画面構成になるはずです。1つの画面ごとに、1つのプログラムが必要になります。プログラムだけでなく、表示用のテンプレートファイルも必要です。今回作るWebアプリケーションは、複数のファイルで構成されることになります。

O/Rマッパーのクラスを作る

巡回用のRSSを登録するために、Pythonのクラスを作りましょう。O/Rマッパーの抽象クラスを継承して、巡回用RSSのデータを保存するためのクラスを定義します。O/Rマッパーの抽象クラスを継承することによって、クラスを利用するだけでデータベースに対するアクセスができるようになります。クラスには、テーブルに定義するカラムを定義しておきます。

以下がクラスを定義するためのスクリプトファイルです。cgi-binフォルダに設置します。驚くほど短いスクリプトファイルですが、これでもちゃんと機能します。

rssurl.py

:::python
#!/usr/bin/env python
# coding: utf-8

import sqlite3
from os import path
from simplemapper import BaseMapper

class Rssurl(BaseMapper):                      # (1)
    rows=(('title', 'text'), ('url', 'text'))

p=path.join(path.dirname(__file__), 'urls.dat')
con=sqlite3.connect(p)
BaseMapper.setconnection(con)

Rssurl.createtable(ignore_error=True)

前半はモジュールをインポートするなどの準備を行っている部分です。クラス定義は中ほどにある2行だけで、巡回用RSSのデータを保存するテーブルのカラムを定義しています(1)。その後では、SQLite3へのコネクションオブジェクトを設定し、テーブルが存在しなかったら作成しています。

SQLiteのデータベースファイルは、このスクリプトと同じフォルダの、「urls.dat」という名前で保存されることになります。スクリプトが完成したら、このファイルをcgi-binフォルダに保存しておきます。

動作チェック

スクリプトを設置したら、このクラスを使って簡単なテストをしてみましょう。シェルでcgi-binフォルダに移動し、Pythonのインタラクティブシェルを起動します。以下のコマンドを入力してみてください。

:::python
>>> from rssurl import Rssurl
>>> ins=Rssurl(title='P', url='http://feeds.feedburner.com/PythonInsider')
>>> for rss in Rssurl.select():
...     print rss
... 
<Rssurl:title=u'P', url=u'http://feeds.feedburner.com/PythonInsider'>

この例では、RssurlクラスというO/Rマッパークラスを使ってデータベースにテスト用のデータを登録しています。登録しているのは、Pythonの新着ニュース(英語)を配信している「Python Insider」というサイトのRSSです。Rssurlクラスのインスタンスを生成してデータを登録したあと、select()メソッドを呼んで登録した内容を確認しています。

動作チェックが終了したら、rssurl.pyとurls.dat、および、以前に作成したsimplemapper.pyをcgi-binフォルダの中にコピーしておいてください。

2014-09-03 15:00