- 追加された行はこの色です。
- 削除された行はこの色です。
*E71:mod_pythonでcookieを使ってみる(2) [#ldf871fb]
さて、第2弾は、Cookie.MarshalCookieを使ってみます。
Cookie.Cookieクラスとの大きな違いは、
+シークレットキーを使って、暗号化、復号をしてCookieの値を使う
+1つのオブジェクトで複数の値を使える
の2点です。
※MarshalCookieを使わず、Cookie.Cookieで複数の値を使うサンプルは[[]]を参照
※MarshalCookieを使わず、Cookie.Cookieで複数の値を使うサンプルは[[E71:mod_pythonでcookieを使ってみる(3)]]を参照
1個目の特徴としては、Cookieの偽装に対応できるってことです。(ユーザが保存したCookieを変造し、サーバに送信した際に、変造を発見することが出来ます。)
※詳しくは、mod_pythonのマニュアルを参照のこと
-http://www.python.jp/doc/contrib/modpython/pyapi-cookie-classes.html
さてさて、ではサンプルを見てみましょう!
サンプルソースの内容は、前回(Cookie.Cookie)とほぼ同じで、
-id : 値を保持する
-counter : カウントアップする
という2つの値をCookieで保持し、処理します。
作成するファイルは、同じく以下のとおり
-.htaccess
-mcookie.py
の2つで、小生は「demo22_mcookie」ってディレクトリに格納してます。
***.htaccess [#h11ccc0a]
.htaccessの内容は以下のとおり。
■.htaccess
# setting Handler
SetHandler mod_python
# Add Python Handler
PythonHandler mcookie ←1
# Debug On
PythonDebug On
# Option OFF
Options None
# setting Handler
SetHandler mod_python
# Add Python Handler
PythonHandler mcookie ←1
# Debug On
PythonDebug On
# Option OFF
Options None
※[[E71:mod_pythonでcookieを使ってみる(1)]]とまったく同じです笑 説明は割愛
***mcookie.py [#dd65b9d2]
同じく、内容は以下のとおり。
■mcookie.py
from mod_python import Cookie,apache
def handler(req):
ck = Cookie.get_cookies(req, \
Cookie.MarshalCookie, secret='seckey')
Cookie.MarshalCookie, secret='seckey') ← 1
if not ck.has_key('count'):
values = {'counter':'0', 'id':'0001'}
values = {'counter':'0', 'id':'0001'} ← 2
ck = Cookie.MarshalCookie( \
'count', values, secret='seckey')
'count', values, secret='seckey') ← 3
num = ck.value['counter']
id = ck.value['id']
num = ck.value['counter'] ← 4
id = ck.value['id'] ← 4
message = \
'No sent MarshalCookie, \
so now create\n %s,%s' % (num, id)
Cookie.add_cookie(req, ck)
Cookie.add_cookie(req, ck) ← 3
else:
countck = ck['count']
num = int(countck.value['counter'])\
+ 1
+ 1 ← 5
id = countck.value['id']
message = 'cookie is %s,%s' % \
(num,id)
values = {'counter':num, 'id':id}
values = {'counter':num, 'id':id} ← 5
mck = Cookie.MarshalCookie('count',\
values,secret='seckey')
Cookie.add_cookie(req, mck)
values,secret='seckey') ← 6
Cookie.add_cookie(req, mck) ← 6
req.write("<html>\n<body>\n<h1>\n")
req.write(message)
req.write("\n</h1>\n</body>\n</html>\n")
return apache.OK
各行の解説
+MarshalCookieの値を取り出す場合、get_cookieメソッドの第2引数に「Cookie.MarshalCookie」クラスを指定し、また、第3引数に暗号/復号用のキー「secret='seckey'」を指定します。&br;
※「seckey」は「3」or「6」で指定してます。
+MarshalCookieクラスに設定するオブジェクトを作成します。&br;
Cookieクラスとは違い、辞書オブジェクトをセットすることが出来ます。
+MarshalCookieオブジェクトを作成します。
--第1引数:クッキー名
--第2引数:値 今回は辞書オブジェクト
--第3引数:暗号/復号キー :任意&br;
作成したクッキーオブジェクトをadd_cookieメソッドを使ってリクエストオブジェクトにセットします。
+画面表示用に、MarshalCookieオブジェクトから「id」と「counter」の値を取得します。&br;
※ck.valueでセットした辞書オブジェクトが取得できて、その要素を['id']という形で指定している
+送信されたクッキーからcounterの値を取り出し、カウントアップして、MarshalCookieに再設定するオブジェクトを作る。
+valueをクッキーに再設定し、リクエストオブジェクトにセットします。
***動かしてみる [#q6d06e0c]
さてさて、資材を配置し、apacheを起動し、配置したURLにアクセスすると、このような画面が表示されます。
&ref(Screenshot0078.jpg);&br;
おお、1回目の画面が表示された&br;
もう一回アクセスすると・・・&br;
&br;
&ref(Screenshot0079.jpg);&br;
おお、ちゃんと足しこまれた! ちなみに、2つ目の「0001」ってのが「ID」です笑&br;
さらにもう一回アクセスすると・・・
&br;&br;
&ref(Screenshot0080.jpg);&br;
ちゃんと足しこまれた笑 さらにもう一回&br;&br;
&ref(Screenshot0081.jpg);
&br;&br;