Pyramidのセッション機能を使う(1)

今回はPyramidでのセッション管理について確認します。
セッション管理については以下に公式ドキュメントがあります。

Pyramidで用意しているセッション管理の方法は、cookieにセッション値を書き込む形式のものです。
UnencryptedCookieSessionFactoryConfigというSessionFactoryを使います。
ドキュメントでも注意されていますが、クラス名の通り、Unencryptedな値をcookieに書き込むのでセキュアである必要が無い場合以外では使うべきではありません。
またcookie値は書き込める容量に限りがあるので、現実的には実際のアプリケーション開発では使えないと思います。

ですが、Pyramidにおけるセッションの使い方について学ぶには手っ取り早いのでこれを使って基本的な動作を確認していきます。
※実際のアプリケーション開発では、pyramid.interfaces.ISessionインタフェースを実装した独自クラスを自分で用意するか、サードパーティ製のセッション管理機能を導入するか、どちらかが必要になります。
サードパーティ製ということでは、ドキュメントでも紹介されているBeakerというライブラリがありますので、それについては別途確認します。

それでは、UnencryptedCookieSessionFactoryConfigを使って確認していきます。
事例は、
  (1)入力 => (2)確認 => (3)実行
という、よくある3画面で処理を確認するケースを使います。
(1)入力画面で入力した値を(2)確認画面でPOST値から受け取り、セッションに格納します。
(3)実行画面ではセッション値を取り出して、それを利用します。

まずルートの__init__.pyで、UnencryptedCookieSessionFactoryConfigを以下のように設定します。

from pyramid.session import UnencryptedCookieSessionFactoryConfig
my_session_factory = UnencryptedCookieSessionFactoryConfig('itsaseekreet')

引数で指定している値は、セッション値を符号化するためのキー値で、なんでも良いですが必須です。
引数は他にもいろいろあって、cookieのnameやpathやdomainなど指定できます。

そしてmain関数のなかでConfigurator作成時にsession_factoryとして指定します。
これでセッションを利用するための設定は完了です。

config = Configurator(settings=settings, session_factory=my_session_factory)

次に、各画面でのセッションの利用の仕方を確認していきます。

(1)入力画面は以下のキャプチャのように2つの入力値があります。
 最初の画面なので特にセッションに関連する処理はありません。
session_input

 nameには、「my name」 valueには「123」と入力してsubmitします。

(2)確認画面は以下のキャプチャようになります。
 POSTされた入力値を受け取り、画面に表示します。
 またセッションにその値を格納します。

session_confirm

 view callableでは以下のようにセッション情報を使います。

session = request.session
session['name'] = request.POST['name']
session['value'] = request.POST['value']
session.changed()

 view callableが引数として受け取るrequestオブジェクトにsessionプロパティがありますのでここからsessionオブジェクトを取得します。
 セッションに値を登録するには、ディクショナリのようにキー値を指定して値を代入します。
 そして最期にchanged関数を呼び出します。
 changedに関してはドキュメントに詳しい説明がありますが、mutableなオブジェクトをセッションに格納している場合は、そのオブジェクトに変更が会ったときにはchangedを実行しておかないとsessionが更新されないようです。
 具体的な事例が確認できませんでしたが、changedは習慣的に実行しておくのが良いようです。

(3)実行画面は確認画面でセッションに格納した情報を取得して画面表示します。
 以下のキャプチャのようになります。
session_execute

view callableのコードは以下です。

session = request.session
name = session['name’]
value = session['value’]

requestオブジェクトからセッションオブジェクトを取得します。
キー値を指定して、格納されているデータを取得することができます。

以上のようにセッションの取り扱い自体は特別難しい事はありません。
ただ、冒頭でも述べた通りUnencryptedCookieSessionFactoryConfigは実際のアプリケーション開発ではなかなか使えません。
次回は、Beakerというライブラリを使ってセッション管理をする方法を確認します。