WSGIとPythonでスマートなWebアプリケーション開発を

第5回 WSGIで利用可能なWebアプリケーションフレームワーク

この記事を読むのに必要な時間:およそ 4 分

viewの定義

views.pyを編集し,表示を行う機能を作成します。

リスト2 views.py

#-*- coding:utf-8 -*-
# Create your views here.

from django import shortcuts, http
import models

from xml.sax import saxutils


def listMessages(request):
    ''' エントリ一覧を出力 '''

    items = models.getEntries()

    esc = saxutils.escape

    for i in items:
        i.title = esc(i.title)
        i.name = esc(i.name)
        i.body = esc(i.body)

    response = shortcuts.render_to_response('index.html',
                                            {'title':'Message Board',
                                             'items':items,
                                             'posturl':'post/',
                                             'esc':saxutils.escape})
    
    return response



def addMessage(request):
    ''' エントリを追加 '''

    post = request.POST

    title = post.get('title', '')
    name = post.get('name', '')
    body = post.get('body', '')

    models.addEntry(name, title, body)

    return http.HttpResponseRedirect('..')

listMessagesとaddMessageを定義しています。addMessageは,リクエストデータの受け取り方やリダイレクトの方法以外は,基本的に前回のGAEからほとんど変わっていませんので,説明は割愛します。

listMessagesは,表示を行う際のHTML生成部分がページテンプレートに置き換えられ,render_to_response関数でレスポンスデータを作成しています。この関数では,第一引数で指定したテンプレートファイルを読み込み,実行してHTMLデータを生成します。第二引数の辞書は,テンプレート中で使用する変数を渡します。

ここで読み込むテンプレートは,INSTALLED_APPSに追加したアプリケーションのあるディレクトリのtemplatesディレクトリから読み込みます。テンプレートファイルの拡張子は.htmlです。ここでは,testappのディレクトリにtemplatesディレクトリを作成し,中にテンプレートファイルを追加します。

テンプレートファイルは,HTMLにデータの埋め込みや制御構文などの文法を追加したものです。

リスト3 テンプレートファイル(index.html)

<html>
  <head>
    <title>{{ title }}</title>
  </head>

  <body>
    {% for x in items %}
    <dl>
      <dt>Title</dt>
      <dd>{{ x.title }}</dd>
      <dt>Name</dt>
      <dd>{{ x.name }}</dd>
      <dt>Date</dt>
      <dd>{{ x.date }}</dd>
      <dt>Body</dt>
      <dd>{{ x.body }}</dd>
    </dl>
    <hr />
    {% endfor %}

    <form method="post" action="{{ posturl }}">
      <dl>
        <dt>Title</dt>
        <dd><input type="text" name="title" /></dd>
        <dt>Name</dt>
        <dd><input type="text" name="name" /></dd>
        <dt>Body</dt>
        <dd><textarea name="body"></textarea></dd>

        <input type="submit" value="post" />

    </form>

  </body>
</html>

{%%} で囲まれた部分には,forなどの制御構文を記述します。この例では,forを使用してitemsの中を走査しています。そして, {{ }} で囲まれた部分は,変数による置換です。このようなテンプレート構文を利用することでHTMLに変数を埋め込むことができます。

テンプレートを使用すると,見栄えとロジックが分離され,管理しやすくなるというメリットがあります。

URLディスパッチの設定

最後に,クライアントからアクセスされた URL と,関数をマッピングする設定を行います。マッピングには,urls.pyを使用します。

リスト4 urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns(
    '',
    # Example:
    # (r'^django_sample/', include('django_sample.foo.urls')),

    # Uncomment this for admin:
    # (r'^admin/', include('django.contrib.admin.urls')),
    ('^post/', 'django_sample.testapp.views.addMessage'),
    ('^', 'django_sample.testapp.views.listMessages'),
)

ここでは,patterns関数にマッピング情報を渡しています。第一引数は,マッピング先モジュールのプリフィクスです。マッピングする関数が同じもジュールにある場合,先頭の共通部分を定義しておくことができます。第二引数以降は,マッチに使用する正規表現と,マッチした結果呼び出される関数のモジュールパスを指定します。

まとめ

少々駆け足気味でしたが,以上がDjangoを使用したアプリケーションをの作成方法です。

このように,アプリケーションフレームワークでは,あらかじめ決められた作成法方に沿ってアプリケーションを作成していきます。このような方法は,作成する側からすると楽ですが,フレームワークの枠組みをこえた使い方をしづらい,アプリケーション全体の動作を把握しにくいといった欠点もあります。そのような利点と欠点を理解した上で,アプリケーションフレームワークを便利に利用すると良いと思います。

Django に関するドキュメントは,公式ページのものと日本のユーザ会のものとがあります。

今回でWSGIの特集は最後です。この特集が, Web アプリケーション開発者の方々のお役に立てれば幸いです。最後まで読んでいただき,有難うございました。

著者プロフィール

保坂翔馬(ほさか しょうま)

CGプロダクションでプログラマとしてPloneで作成した社内情報共有ポータルの開発・管理,3Dモデリングソフトのツール・プラグイン開発,システム管理用補助ツール作成など幅広く仕事をしている。主たる業務はPloneポータルの開発。

仲間内ではプログラム言語オタクで通っており,好きな言語はPython, Haskell。

Twitter:@shomah4a