セッションの仕組みを理解しよう
7.2 セッションの仕組みを理解しよう
セッション(Session)の仕組みについて学習していきましょう。セッションは大量のデータを一時的に保存するには向いています。
7.2.1 セッションについて
セッションを簡単に説明すると「サーバ内に情報を保存し、複数ページ間で共有する」仕組みのことです。
例えば、ショッピングサイトで利用されるカート機能などは、複数の商品ページを遷移し、カートに追加した各商品の情報をずっと保持している必要があります。
このような場合にセッションにデータを登録することで、他の画面に遷移してもデータを取り出し利用することができるのです。セッションでは下の図のようにデータを共有することができます。
図 7.2.1: セッションでデータ共有の流れ
また、セッションの特徴をまとめると以下になります。
- セッション情報はサーバ内に保存される。
- 保存された情報はブラウザ単位で管理される。
- セッションの有効期限は固定されている。(ブラウザを閉じるまで、設定ファイルで決められた時間)
- セッションに格納する情報は、プログラムのデータ形式(文字、数値、配列…)のまま保存できる。
- セッションに保存できるデータ量と個数にほぼ限界はない。(最大はディスク容量まで)
- セッション情報がどのクライアントの情報なのかを関連づける仕組みは、クッキーに登録したセッションIDまたはキャッシュなどで管理している。※この仕組みは次の項で詳しく説明します。
■Cache(キャッシュ)とは
訪問した際に「ウェブページの情報」が一時的にWebブラウザに保存される仕組みです。CookieはIDに紐づけられる形でデータが登録されるが、キャッシュではテキスト情報だけでなく画像などの情報も一時的に保存されます。
7.2.2 セッションを管理する仕組み
クッキーを利用する場合
多くのWebアプリケーションではセッションを利用すると、自動的にセッションIDと呼ばれる一意のIDが発行されます。このセッションIDはセッションに登録されたデータに紐付けられるとともに、クッキーに保存されます。
セッションIDが登録されたブラウザは、Webアプリケーションにアクセスする際にセッションIDを送信するため、サーバ側ではこのIDを確認することで一連のアクセスであることが認識できるようになります。
登録したIDは、「PHPSESSID」という名前のクッキーとして登録されます。自動的にクッキーに登録された「PHPSESSID」がセッションIDを保持しています。
セッションIDをクッキーで保存しているため、Webブラウザでクッキー設定を無効にされるとセッションも利用できなくなるので注意が必要になります。
図 7.2.2:クッキーに登録されたセッションID
このクッキーに登録されたセッションIDとサーバ上のセッションデータの関係は次のようになります。
まず、プログラムにアクセスしセッションを利用するとセッションIDが生成され、最初の画面の表示と同時にクッキーに登録されます。その際、サーバ上のセッションのデータにも同じセッションIDが紐付けられます。
図 7.2.3: セッションIDをクッキーへ登録
2回目以降のアクセス時には、リクエストと一緒にサーバに送信されたクッキー(セッションID)をもとに、セッションのデータを参照することができます。
図 7.2.4: セッションデータの参照
クッキーに登録されたセッションIDの有効期限は、ブラウザを閉じるまでか設定ファイルで定められた時間までです。そのため、ブラウザが閉じられた(セッションが切れた)後のアクセスでは、クッキー内のセッションIDは無効となり、Webアプリケーションから新しいセッションIDが発行されます。そのため、古いセッションIDのデータは参照できなくなります。
図 7.2.5: ブラウザを閉じて再アクセス
■ 同じブラウザを複数起動している場合の注意
同じブラウザを複数起動している場合、セッションIDが共有されるため、ブラウザを1つ閉じただけではセッションが切れない場合があります。セッションを切って再アクセスが必要な場合は、同じブラウザを全て閉じてから再アクセスしましょう。
キャッシュを利用する場合
またアプリケーションによってはキャッシュの仕組みを利用して、セッションデータを登録することもできます。
キャッシュはクッキーに似ていますが、IDに紐づけてられたデータが登録されるというよりは、サーバへ要求したデータをそのまま、クライアント(Webブラウザ)に保存されるか、またはサーバにキャッシュ用のデータとして保存されます。
キャッシュを介してセッションデータを登録した場合、再度データの生成することなくサーバから取得できます。
セッションデータにはセッションIDも含まれているため、サーバ側でPythonのプログラムを介して該当のIDと紐づける形でデータを取得できます。
図 7.2.6: セッションをキャッシュへ登録
2回目以降のアクセス時には、リクエストとセッションIDを指定することでサーバに保存されたセッションデータをIDに紐づける形で取得できます。
図 7.2.7: セッションデータの参照
7.2.3 セッション利用の準備をする
まずセッションをプログラムで扱う場合、「settings.py」を以下の内容に従って編集します。
■ リスト変数、INSTALLED_APPSに既定の要素を追加する
INSTALLED_APPS = [ 'django.contrib.sessions', ]
■ リスト変数、MIDDLEWAREに既定の要素を追加する
MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', ]
■ 保存方法を指定する
保存方法を指定するために以下のどれかの一文を任意の箇所に記載します。
SESSION_ENGINE = "django.contrib.sessions.backends.cache" #キャッシュで保存 SESSION_ENGINE = "django.contrib.sessions.backends.file" #ファイルで保存 SESSION_FILE_PATH = “ファイルのパス” #ファイルで保存する SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" #クッキーで保存
7.2.4 セッションを利用してみよう
セッションをプログラムで扱いたい場合、HttpRequestクラスのインスタンス変数requestのsessionメソッドを利用すれば行えるようになっています。
■セッションへ保存と取得
HttpRequestクラスのインスタンス変数requestを利用して、キー文字列は任意で設定します。
書式
request.session[キー文字列] = 値 #セッションへ保存 request.session[キー文字列] #セッションから取得
記載例
request.session['name'] = "神田タロウ" #神田タロウを保存 name = request.session['name'] #セッションからキー文字列を指定して取得
セッションへはプログラム内で扱えるデータ形式なら、なんでも保存することが可能になっています。データ形式がそのままなので、他のページでそのデータを扱う場合セッションから取り出して直ぐにプログラムで使えるため大変便利になっています。
■セッション情報は保存後直ぐに使える
セッションは保存処理を行ったリクエスト時からでも保存した情報を直ぐ利用することができます。セッション情報は複数のページ間で利用することを前提としていますが、自身の処理内で利用しても構いません。
■セッションの存在判定
書式
if キー文字列 in request.session:
記載例
#nameの存在判定を行う if “name” in request.session:
■セッションの削除
書式
del request.session['キー文字列] #特定のキーのセッションを削除する request.session.clear() #セッションをクリアにする
記載例
#nameのセッションを削除する del request.session['name']