mod_pythonのSession

ここ最近、mod_pythonに凝りはじめてます。

mod_pythonではPHP等と同様、セッション管理を勝手にやってくれる。ということになっているが、デフォルトではセッションCookieにExpiresをつけて送信しないため、ブラウザを閉じるとまたログインし直す羽目になる。そういうわけで1ヶ月くらいは、この状態でセッションを使っていた。

まあそれはそれでポリシーとしては問題ない場合が多いかもしれないけど、「おれはブラウザを閉じてもログアウトしたくないんだよ」という人にとっては迷惑な仕様になる。単に自分だけで使うために簡単な認証をかけているだけなのだが、私の場合は京ぽんのOperaでログインして遊んだりしているが、電話はメールを使うためにもブラウザはすぐに閉じてしまう。そうやっていると毎回パスワードを入力する羽目になり、非常に面倒だった。しかも京ぽんOperaの場合、ユーザ名を漢字かな、パスワードを数字にしとかないと入力がとても…

そして私はおもむろに解決策を探し、見つけたのだった。

ちなみにPHPの場合も同じようにデフォルトでExpiresはつかないが、session_set_cookie_params()で設定できるようになっている。リファレンスを見ればすぐに分かるんだね。えらい。

しかしmod_pythonはもっと硬派なので、マニュアル(python.jp)なんか読んでもさっぱり分からない。

以下のようにする。

from mod_python import Session,util,Cookie
sess=Session.Session()
if sess.is_new():
  util.redirect("login")
c=sess.make_cookie()
c.expires=time.time()+60*60*24*30
Cookie.add_cookie(req, c)

最初の4行はマニュアルを見れば分かる。最後の3行がExpiresの設定だが、これを発見する作業には苦労させられた(笑)。ちなみにマニュアルにあるtimeoutはCookieのExpiresではなく、サーバ側のタイムアウトの設定なので、違うんだよね。

ここに至るまで、実はいろいろ試行錯誤して、sessインスタンスのmake_cookie()をどうにかして自分の関数で上書きしようとしたり(型チェック等に引っかかって失敗)、BaseSessionのmake_cookie()を上書きして混ぜるように書いてみたり(これは成功…だがとても長くなる)したんだよね。

元はと言えば、BaseSessionの中でmake_cookie()の戻り値のCookieをselfに保存せず、すぐにCookie.add_cookie()に渡してしまう実装になっていたので、迷ったんだよね。

Cookie.add_cookie()に同じ名前のcookieを与えたら、上書きして1つになってくれる、ということに気がつかなければ(私はBaseSession.invalidate()のコードを見てて、やっと気づきました)、一生わからなかったかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です