ここ最近、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()のコードを見てて、やっと気づきました)、一生わからなかったかもしれません。