このサイトについて

11月28日(木),プログラミングの勉強会を開催します。エクセルの操作やスクレイピングをきっかけに学ぶ自動化のひみつ。

みんなのPython Webアプリ編 - WebサービスとしてRSSリーダーを作る

みんなのPython Webアプリ編 - WebサービスとしてRSSリーダーを作る

Python,プログラミングに興味のある方のためのFacebookグループ。Python関連グループとしてナンバーワン。

WebサービスとしてRSSリーダーを作る

これまで、Pythonを使ってWebアプリケーションを作るために必要となる、基本的な知識について解説してきました。ここでは、これまで学んだ知識を使って、より本格的なWebアプリケーションを作ってみましょう。

ここで作るのは簡易なRSSリーダーです。RSSのURLを入力すると、内容を読み込み整形して表示します。

実際にWebアプリケーションを作る前に、開発に利用するクラスや関数などを作成します。他のWebアプリケーションを作る際にも使い回しできるように配慮したクラスや関数を作ります。

リクエストの処理

まず最初に、リクエストをうまく扱う方法について考えてみましょう。

リクエストはWebアプリケーションに対する入力です。Webブラウザ上に表示されたフォームなどのUIから、文字列のデータとしてWebサーバに送られてきます。Webアプリケーション側では、主にクエリとして情報を受け取ります。実際には、クエリ以外にも多くの情報がWebブラウザからサーバに送られていますが、今の段階ではクエリ以外の情報を使うことはありません。

Webアプリケーションでは、UIから送られたクエリデータを解析、変換する作業を毎回行います。PythonでWebアプリケーションを書くときには、cgiモジュールのFieldStorage()関数を使います。FieldStorage()関数では、リクエストの内容をPythonの文字列などに変換します。変換されたデータを使って、処理を行うわけです。

プログラムで毎回行う定型処理は、モジュールやクラスのような形でまとめておくと便利です。

「値を与え、結果を返す」という単純な処理であれば関数として実装するべきです。しかし今回は、クエリのデータをどこかに保存する必要があります。そのような用途に利用するためには、クラスを定義しておくと便利です。

Pythonのクラスでは、アトリビュートにいろいろなデータを保存しておくことができます。クエリのデータをアトリビュートに保存しておけば、いろいろな場所で利用することができます。また、リクエストのデータを処理するための定型処理をメソッドとして定義しておく、といった使い方もできます。

では、リクエストのデータを取り扱うためのクラスを作ってみましょう。Pythonの場合、クラス名は大文字から始めるという規則になっていますのでRequestという名前のクラスを作ってみることにします。

Requestクラスを実装する

Pythonのクラスでは、init()という初期化メソッドが利用できます。クラスインスタンスを作るときに呼ばれるメソッドです。このメソッドの中で、クラスインスタンスの初期化を行います。Requestクラスではリクエストに送られてくるクエリを取り出し、Pythonのデータ型に変換してインスタンスに保存しておきます。初期化メソッドではこの処理を行うことになります。

以下が、現時点でのRequestクラスの定義になります。初期化メソッドがあるだけの、とてもシンプルなクラスです。

Requestクラスの定義(httphandler.py)

:::python
# 標準モジュールをimportする
import cgi
import os
class Request(object):
    """
    HTTPのリクエストをハンドリングするクラス
    CGI側でインスタンスを生成することによって利用する
    クエリデータや環境変数へのアクセス,主要ヘッダへの
    アクセス用メソッドを提供
    """
    def __init__(self, environ=os.environ):
      """
      インスタンスの初期化メソッド
      クエリ,環境変数をアトリビュートとして保持する
      """
      self.form=cgi.FieldStorage() 
      self.environ=environ

Pythonのメソッド定義では、第1引数に必ずselfという引数を指定します。引数selfには、クラスから作られるインスタンスオブジェクトが渡ってきます。メソッドの内部でインスタンスのアトリビュートを利用したいときには、selfからドットを挟んでアトリビュート名を指定します。

新しいアトリビュートを作るときには代入を行います。変数を定義するときと同じです。Pythonには、JavaやC++のようなオブジェクト指向言語にある「メンバ変数」のような仕組みがありません。そのため、クラスインスタンスに必須なアトリビュートは、初期化メソッドで定義しておくようにします。

初期化メソッドでは、第1引数self以外にenvironという引数が指定されています。この引数には、デフォルト値として環境変数を渡しています。環境変数には、Webアプリケーションが受け取ることができるさまざまな情報がつまっています。あとあと利用することがあるはずですので、環境変数の情報もインスタンスのアトリビュートして保存しています。

クラスの定義、メソッドの定義には、三重引用符で囲まれた文字列が見えます。この文字列はドキュメンテーション文字列と呼ばれています。ドキュメンテーション文字列には、クラスや関数に関する解説や使い方を書いておくようにします。

Requestクラスの使い方

Webアプリケーションでは、「req=Request()」のようにしてRequestクラスのインスタンスオブジェクトを作るようにします。クラスを作ることによって、リクエストとして送られてくる情報がインスタンスのアトリビュートに入ります。プログラムでは、インスタンスオブジェクトを経由してリクエストの情報にアクセスし、処理を実行するわけです。

みんなのブロックチェーン

ブロックチェーンの入門書を書きました。暗号やハッシュなどを含め,基礎からブロックチェーンの仕組みを学べる書籍です。いろんな方に「新しい技術を学ぶことの楽しさ」を感じ取ってくれたら著者として嬉しいです:-)。お金は技術的にどのように定義されるのか。

2014-09-03 15:00