2010年7月2日金曜日

【Python】デコレータをやってみる

Pythonを始めてから早9ヶ月。
最近ものすごくPythonが楽しい。

そこで今日は、ちょっと前から気になっていた「デコレータ」に挑戦してみようかな。


まず「デコレータ」(decolator)について調べてみると、言葉の意味から
分かるように「装飾する」ものとして動くらしい。
数カ月前に知り合いのプログラマが「デコレータいいよ」って言ってた
ときは全然分からなかった(何に使うのか/自分にとって必要なのか)が、
やってみるとこれは凄い!


僕は今回以下のサイトで勉強させてもらいました。
ありがとうございますm(_ _)m

http://www.ianlewis.org/jp/appengine-maintenance-page
http://www.gesource.jp/weblog/?p=3498
http://satoshi.blogs.com/life/2009/11/python入門デコレータとは.html
http://jutememo.blogspot.com/2008/10/python-1_09.html



前々から自分の書くコードはなんとなく他の人のものよりも長い!
おんなじようなことをいろんなところでやってる!
もっとまとめられないのか??

そんな悩みを解決できそうなのが「デコレータ」。


というわけで早速やってみる。



今回は、
「ログイン状態をチェックし、ログインしていない場合にはログインページへ、admin権限でログインしていない場合にはログイン画面へリダイレクト」
というのをやる。

書いてみたのが以下のメソッド


#ログイン状態をチェックするデコレータ
def check_login_status(req):
 def wrapped(request, *args, **kwargs):
 #ログインしていない場合はログイン画面へリダイレクトする
 if not user_account:
  request.redirect('/login')
  return
 #管理者権限を持っていない場合はユーザ向けページへリダイレクトする
 if not users.is_current_user_admin():
  request.redirect('/user')
  return
 return req(request, *args, **kwargs)
return wrapped




実際には以下のように使用している。

class AdminMainHandler(webapp.RequestHandler):
 layout = 'admin.html'
 @check_login_status
 def get(self):


ポイントは

・クラス内のメソッドの直前に「@check_login_status」という形で
デコレータを呼び出す。

・デコレータは「def get(self)」自体を受け取り(reqとして使用)、
 直後の「def get(self)」の「self」を受けて(requestとして使用)、
 ログイン状態を判定し、リダイレクトなどの処理を行う。

という感じだと思う。




まぁここで気になったのはデコレータの中で使っているwrappedの
*args, **kwargs」だが、これについても別途書き綴ってみたいと思う。



今日は疲れたのでちょっと休む。

0 件のコメント:

コメントを投稿