HTTPセッションの使用
次にWebアプリケーションでは必須の機能となるセッション機能を使用してみましょう。ECサイトに買い物かご機能を付加して複数の商品を購入できるように機能を追加します。
セッションの有効化
まずはDjangoのプロジェクトでセッション機能用のミドルウェア(django.contrib.sessions.SessionMiddleware)とアプリケーション(django.contrib.sessions)を有効化するための設定をsettings.py(リスト14)に記述する必要があります。この設定はデフォルトで有効になっていますので、特に編集する必要はありません。
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
)
~省略
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
~省略
)
買い物かごの実装
商品ページの修正
買い物かごの機能は商品ページの「買い物かごに入れる」ボタンを押下すると、セッション情報に、購入商品情報(商品、購入数、価格など)を格納し、買い物かごの中身を画面に表示するという機能とします。
まずは商品ページに買い物かごに遷移するための機能を追加するためテンプレートを修正します。リスト15のようにテンプレートを修正してください(太字の箇所を追加しています)。formを追加し、商品の購入個数とitem_id(hidden)を送信できるようにしています。図12が修正後の画面イメージです。
<html>
~省略
商品コード:{{ item.item_code }}<br>
商品名:{{ item.item_name }}<br>
価格:{{ item.price }}円<br>
<br>
<form action="/cart" method="POST">
購入個数:<input type="text" name="buy_num" value="1"><br>
<br>
<input type="submit" value="買い物かごに入れる">
<input type="hidden" name="item_id" value="{{ item.id }}">
</form>
~省略
</html>
買い物かご用ビュー関数の実装
買い物かごの機能を実現するためのビュー関数は、アプリケーションフォルダのview.pyのdo_cartビュー関数に記述します。購入情報は、セッションにリスト形式で保存します。まずは、リストに格納する購入情報を格納するクラスをリスト16に示します。
# -*- coding: utf-8 -*-
class CartItem:
item_id = 0
item_code = None
item_name = None
price = 0
buy_num =0
次に、買い物かご情報を操作するビュー関数(do_cart)をリスト17に示します。
def do_cart(request):
# hiddenのitem_idを取得しintに型変換
item_id = int(request.POST['item_id'])
item = Item.objects.get(id=item_id)
# DBからItem情報を取得する。
cart_item_list = request.session.get('cart_item_list',[])
ci = CartItem()
ci.item_id = item_id
ci.item_code = item.item_code
ci.item_name = item.item_name
ci.price = item.price
ci.buy_num = request.POST['buy_num']
cart_item_list.append(ci)
request.session['cart_item_list'] = cart_item_list
return direct_to_template(request,'page/cart_item_list.html',
extra_context={
'cart_item_list': cart_item_list,
}
)
POSTされたデータを取得し、データ処理をする際には、前掲したFormクラスを使用するのが通常ですが、ここではサンプルの簡略化を図るため、request.POSTから取得した値をint変換する方法を採用しました。
買い物かご中身表示用テンプレートの定義
ビュー関数で制御されている買い物かご情報を表示するテンプレートがcart_item_list.htmlです。リスト18にテンプレートの内容を示します。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>買い物かご</title>
<head>
<body>
<center>買い物かごの中身は次のとおりです。<br>
<table border="1">
<tr><th>商品コード</th><th>商品名</th><th>価格</th><th>購入個数</th></tr>
{% for cart_item in cart_item_list %}
<tr>
<td>{{ cart_item.item_code }}</td>
<td>{{ cart_item.item_name }}</td>
<td>{{ cart_item.price }}円</td>
<td>{{ cart_item.buy_num }}個</td>
</tr>
{% endfor %}
</table>
</center>
</body>
</html>
urls.pyの定義
最後にdo_cartビュー関数とURLをマッピングをurls.pyファイルに設定します(リスト19)。
urlpatterns = patterns('',
~省略
(r'^cart', 'ecsite.itempage.views.do_cart'),
)
買い物かご機能の実行
それでは商品ページ「http://localhost:8000/item/1」にアクセスし「買い物かごに入れる」ボタンを押下してください。買い物かごの情報が表示されます。ブラウザの戻るボタンで戻り、購入個数を「2」を入力し「買い物かごに入れる」ボタンを再び押下してください。図13のように、前回「買い物かごに入れる」ボタンを押下した際の情報も一緒に表示されるはずです。これで前回分の情報がセッションに保存されていることが確認できました。
セッション情報の保存ストレージについて
Djangoではセッション情報の保存先をいくつか用意しています。以下の表にセッション情報の保存先をまとめました。
| セッション保存先 | 設定 | 説明 |
| データベース | SESSION_ENGINE= 'django.contrib.sessions.backends.db' |
DBにセッション情報を保存する。Djangoのデフォルト設定 |
| ファイル | SESSION_ENGINE= 'django.contrib.sessions.backends.file' |
ローカルファイルにセッション情報を保存する。 |
| キャッシュ | SESSION_ENGINE= 'django.contrib.sessions.backends.cache' |
キャッシュシステム(後述)にセッション情報を保存する。 |


