4.8.1 Classes

Session( req[, sid, secret, timeout, lock, lockfile])
この関数は MPM に問い合わせを行い、その結果に基づいて DbmSessionMemorySession のいずれかの新たなインスタンスを返します。 この関数はBaseSession と同じ引数を取ります。

MPM がスレッドで動作しており、かつ fork していない場合 (Windows のようなケース です) や、スレッドで動作し fork してはいるがプロセス数が一つに制限されている場合 (このように動作させるには作業者 MPM (worker MPM) を設定します) 場合には MemorySession が使われます。 それ以外の場合にはDbmSession が使われます。

クラス BaseSession( req[, sid, secret, timeout, lock, lockfile])

このクラスは、実際のセッション保存メカニズムを実装している別のクラスの基底 クラスとして使われています。req は必須の引数で、mod_python のリクエストオブジェクトを参照していなければなりません。

BaseSessiondict のサブクラスです。 セッションを辞書として使うことで、データをセッションに保存したりセッションから 取り出したりできます。

sid はオプションのセッション id です。この値を指定する場合、該当する セッションが既に実在していなければなりません。該当するセッションが実在しない 場合、sid は無視され、新たなセッション id を持ったセッションが生成 されます。sid を指定しなかった場合、オブジェクトはクッキーの中から セッション id を捜し出そうとします。クッキー中にセッション id が見つかったが、 未知のセッション id だったりセッションが期限切れになっている場合、新たな セッション id を作成します。セッションが「新しい(new)」かどうかは、 is_new() メソッドを呼び出せば判別できます。

セッションで作成したクッキーは、サーバの DocumentRoot と 現在の処理を担当しているPythonHandler ディレクティブの場所 を比較して算出した path 属性を持ちます。例えば、ドキュメントルートが /a/b/cPythonHandler を指定した場所が/a/b/c/d/e の場合、path は/d/e になります。ApplicationPath オプションを 使うと、特定のパス名を強制的に指定できます (サーバ設定内で、 "PythonOption ApplicationPath /my/path" のように指定します)。

secret を指定した場合、BaseSession はクッキー生成時に SignedCookie を使い、セッション id の偽造をほぼ不可能にします。 デフォルトでは通常の Cookie を使います (たとえ署名されていなくても、 セッション id は非常に推測しにくい方法で生成されています)。

セッションは、timeout 以上の間アクセスを受けないとタイムアウトします。 timeout のデフォルト値は 30 分です。期限切れのセッションに アクセスしようとすると「新たな」セッションが開始されます。

lock 引数はロックを行うかどうかを表します (デフォルト値は 1 です)。 ロックが有効になっている場合、一度に一つのセッション id について一つのセッション オブジェクトしかインスタンス化できません。このとき、lockfile はプロセス間 のロックに使うファイルの名前です。

セッション id が新たに生成された状態では、セッションは「新しい」といいます。 その逆は、セッション id をクッキーや sid 引数で指定した場合です。

is_new( )
セッションが新しい場合、1 を返します。期限切れのセッションや実在しない セッションのインスタンスを生成しようとした場合にも、「新しい」セッションに なります。例えば以下のように、セッションのインスタンスを生成する試みが成功したか どうかを調べる場合にはこのメソッドが重要になります:
sess = Session(req)
if sess.is_new():
    # redirect to login
    util.redirect(req, 'http://www.mysite.com/login')

id( )
セッションの id を返します。

created( )
セッションの生成時刻をエポック (epoch) からの経過秒数で返します。

last_accessed( )
セッションの最終あq癖素時刻をエポックからの経過秒数で返します。

timeout( )
セッションのタイムアウト期限を秒数で返します。

set_timeout( secs)
セッションのタイムアウト期限をsecs 秒にします。

invalidate( )
セッションを永続化ストレージ (persistent store) から削除し、 該当するセッション id のクッキーを無効化するためのヘッダを出力ヘッダ部に 配置します。

load( )
セッションの値をストレージから読み出します。

save( )
セッションの値をストレージに書き込みます。

delete( )
セッションをストレージから削除します。

init_lock( )
セッションのロックを初期化します。このメソッドを呼び出す必要はありません。 このメソッドが定義されているのはサブクラスで別のロックメカニズムを 使いたい場合のためです。

lock( )
セッションをロックします。他のスレッドやプロセスがすでにセッションをロックして いる場合、ロックが解除されるまで待機します。ロックを自動的に制御している場合 (デフォルトの場合) には、このメソッドを呼び出す必要はありません。

このメソッドはリクエスト処理の終了時に常にセッションのロックを解除する ような後処理関数を登録します。

unlock( )
セッションのロックを解除します (lock() と同じく、ロックが自動制御 (デフォルト) の場合には、このメソッドを呼び出す必要はありません)。

cleanup( )
サブクラスでセッションストレージを消去 (期限切れのセッションを削除する など) するメカニズムを実装するためのメソッドです。このメソッドは ランダムに呼び出されることになり、呼び出しの起きる確率はSession モジュールの変数 CLEANUP_CHANCE で制御されています (デフォルトの値は 1000 です)。この値は、ストレージの消去がランダムに 発生し、その確率が 1000 分の 1 であることを意味します。 サブクラスでこのメソッドを実装する場合、必ずしも (時間のかかる) 消去 処理をこのメソッド内で行わなくても構いませんが、その場合には req.register_cleanup を使ってリクエストの処理後に実行 される後処理関数を登録してください。

クラス MemorySession( req, [, sid, secret, dbmtype, timeout, lock])

このクラスでは、グローバル名前空間上の辞書を使ったセッションストレージを 提供しています。このクラスはパフォーマンスの点では最高ですが、マルチプロセス の設定では利用できず、アクティブなセッションができるたびにメモリを消費するという 問題があります。

このクラスを直接使うとクロスプラットフォームにならないので注意してください。 できるだけプラットフォーム間での互換性をもたせたければ、常にSession() を使うようにしてください。

クラス DbmSession( req, [, dbm, sid, secret, dbmtype, timeout, lock])

このクラスでは、dbm ファイルを使ったセッションストレージを 提供しています。dbm のアクセスは非常に高速で、ほとんどの dbm 実装では メモリマップファイルを使って高速化を実現しているため、ほぼ共有メモリ アクセスに近いパフォーマンスを出せます。

dbm は dbm ファイルの名前です (ファイルは httpd プロセスから読み書き できなければなりません) このファイルはサーバプロセスが停止しても削除されません (このため、サーバが再起動してもセッションは死なないという便利な副作用があります)。 デフォルトでは、セッション情報はtempfile.gettempdir() 標準ライブラリ 関数の返す一時ディレクトリ下の mp_sess.dbm というファイルになります。 このデフォルト値は PythonOption SessionDbm filename を設定して オーバライドできます。

実装では Python の anydbm モジュールを使っています。 このモジュールは、デフォルトではほとんどのシステムで dbhash を 使います。特定の dbm 実装 (例えば gdbm) を使いたければ、 dbmtype にモジュールを渡せます。

このクラスを直接使うとクロスプラットフォームにならないので注意してください。 できるだけプラットフォーム間での互換性をもたせたければ、常にSession() を使うようにしてください。