djangoで自作デコレータを使ってみる

djangoで自作デコレータを使ってみる

djangoが用意してくれていたデコレータしか使った事がなかったので、動きを確認する為に使ってみたいと思います。今回はデコレータでrequestを受けてGETパラメータがhelloだったらページ遷移し、それ以外だったら404に飛ばしてみたいと思います。

参考:
  ・一番シンプルな例を載せて下さっています。
    Pythonのデコレータについて
  ・理解が出来るように順を追って丁寧に説明して下さっています。
    Pythonのデコレータを理解するための12Step
  ・djangoでデコレータがrequestを受け取る方法です。
    私のDjangoビューデコレータがリクエストを渡さないのはなぜですか?

プログラム

忘れずにwwrpsをインポートしてあげましょう。
肝心な部分はfuncには自身のdisplay_index()が入ってくると言う事ですね。


from functools import wraps
from django.http import Http404
from django.shortcuts import render

def param_check(func):
    @wraps(func)
    def wrapper(request, *args, **kwargs):
        print(request.GET.get('param'))
        if request.GET.get('param') == 'hello':
            return func(request, *args, **kwargs)
        else:
            raise Http404

    return wrapper


@param_check
def display_index(request, *args, **kwargs):
    return render(request, 'jsonapp/index.html')

無事に下記の通り遷移することが出来ました。
http://localhost:20081/jsonapp/display_index/?param=hello <- index.htmlに遷移 http://localhost:20081/jsonapp/display_index/?param=world <- 404ページに遷移