Symfoware

Symfowareについての考察blog

Google App Engine Pythonでセッションらしきものを実装する

Google App Engineでセッションを使いたかったのですが、
どうも標準の方法では用意されていない模様。

まあ、セッションレプリケートとか考えると、大規模システムでは
安易にセッションは使えないかと。

セッション自体、Cookieにランダムな値を発行して、それに対応する
オブジェクトをサーバーのメモリ、もしくはファイルから復旧
というプログラムで実装するには面倒な手順を、こっそり裏方で
実行してくれているだけのはずなので、手で実装してみます。



Cookieの使用



Cookieに保存されている値は、


self.request.cookies.get('キーの名前', 'デフォルト値')


これで取得できます。

じゃあ、

self.response.cookies.set('キーの名前', '設定値')


で値が設定できるかというと、そう簡単な話ではないようで、
同じように苦労されている方の記事を参考にさせていただきました。

Google App EngineでCookieを発行する
http://python.g.hatena.ne.jp/edvakf/20090213/1234479987

・・・手間ですが、ほかに方法がないのならやるしかない。
この方法でCookieに値を保存することにします。



セッションキーの作成



あまり何も考えず、乱数で32桁の0-9,a-Zまでの値を生成し、
Cookieに設定することにします。



セッションの破棄



これはまだ試していないのですが、

Google App Engine Python 用の cron を使用したスケジュール タスク
http://code.google.com/intl/ja/appengine/docs/python/config/cron.html

この機能で、定期的に一定時間アクセスされていないデータを
データベースから削除するジョブを仕込んでおけばうまくいきそうです。



実装



簡単ですが、こんな感じで実装しました。


#!/usr/bin/env python
# -*- coding:utf-8 -*-

#Google App Engine拡張

import random

class Session():
    
    def __init__(self, request, response):
        
        self.key = request.cookies.get('bj_session', None)
        
        if not self.key:
            self.key = self.create_key()
            response.headers.add_header(
                'Set-Cookie',
                'bj_session=%s; expires=Fri, 31-Dec-2020 23:59:59 GMT' \
                % self.key)
    
    def create_key(self):
        keys = ('1','2','3','4','5','6','7','8','9','0',
                'a','b','c','d','e','f','g','h','i','j',
                'k','l','m','n','o','p','q','r','s','t',
                'u','v','w','x','y','z',
                'A','B','C','D','E','F','G','H','I','J',
                'K','L','M','N','O','P','Q','R','S','T',
                'U','V','W','X','Y','Z')
        
        key_count = len(keys) - 1
        session_key = ""
        for i in xrange(32):
            session_key += keys[random.randint(0, key_count)]
        
        return session_key
        

    def get_key(self):
        return self.key



厳密にセッションと同様の動作をするわけではなく、キーの管理を
行うオブジェクトを想定しています。



def get(self):
    #cookieテスト
    session = gae_ext.Session(self.request, self.response)
    
    #zip_code = self.request.get("zip_code")
    template_values = {'key' : session.get_key()}



こんなサンプルコードを書いて、二回目のアクセス以降同じ値が
表示されることを確認しました。





関連記事
  1. 2009/12/26(土) 12:10:08|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<DebianにOracle xe universal 10g R2 をインストール | ホーム | Google App Engine PythonのDatastore APIを使用する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/258-f6dc26d9
この記事にトラックバックする(FC2ブログユーザー)