最近ものすごくPythonが楽しい。
そこで今日は、ちょっと前から気になっていた「デコレータ」に挑戦してみようかな。
まず「デコレータ」(decolator)について調べてみると、言葉の意味から
分かるように「装飾する」ものとして動くらしい。
分かるように「装飾する」ものとして動くらしい。
数カ月前に知り合いのプログラマが「デコレータいいよ」って言ってた
ときは全然分からなかった(何に使うのか/自分にとって必要なのか)が、
やってみるとこれは凄い!
ときは全然分からなかった(何に使うのか/自分にとって必要なのか)が、
やってみるとこれは凄い!
僕は今回以下のサイトで勉強させてもらいました。
ありがとうございますm(_ _)m
ありがとうございます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」だが、これについても別途書き綴ってみたいと思う。
「*args, **kwargs」だが、これについても別途書き綴ってみたいと思う。
今日は疲れたのでちょっと休む。