Kay Framework でログイン必須のビューを作る方法

Kay チュートリアルでも紹介されていますが、ログイン必須のビューを実装するなら、kay.auth.decorators.login_required デコレーターを使うのが手っ取り早いです。

from kay.auth.decorators import login_required

@login_required
def index(request):
    return render_to_response('myapp/index.html', {'message': _('Hello')})

ただ、このデコレーターはメソッドとして実装したビューにのみ対応していて、クラスとして実装したビューには対応していません。残念。ビューをクラスで実装している場合どうすれば…。

仕方ないので、BaseHandler 派生クラス用の login_required デコレータを自作して使っています。

from werkzeug.exceptions import Forbidden
from kay.utils import create_login_url

def login_required(original_func):
    def decorated_func(self, *args, **kwargs):
        if self.request.user.is_anonymous():
            if self.request.is_xhr:
                return Forbiden()
            else:
                return redirect(create_login_url(self.request.url))
        return original_func(self, *args, **kwargs)
    return decorated_func

class IndexHandler(BaseHandler):
    # 自作のデコレーターを使用
    @login_required
    def get(self):
        return render_to_response('myapp/index.html', {'message': _('Hello')})

index = IndexHandler()

自作と言っても、kay.auth.decorators.login_required のソースコードをコピーし、引数や request まわりを修正しただけの簡単なものですけど。

でも、せっかくビューをクラスで実装できるのだから、クラス用の login_required デコレーターも Kay に標準で欲しいですね。