Python
Django

Django でデコレータを使って View への preprocess を実装してみる

More than 5 years have passed since last update.

Python には decorator という機能があります。Java でいう annotation や .Net の attribute のようなものです。

こいつを使って Djnago でリクエストを受け取って View へ処理を渡す前に事前処理を実装することができます。

たとえば、ログインが必須のリクエストで未ログインの場合は 404 を raise させたりするとか。

その場合はこんなふうに書きます。


myproject/myapp/views.py

import functools

from django.http import Http404

def login_required():
def preprocess(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
# View の Request オブジェクトを取り出す
request = args[0]

# ログイン状態を取得
if not request.session.get('logged_in'):
raise Http404

return func(*args, **kwargs)
return wrapper
return preprocess

@login_required()
def mypage(request):
:
:
:


と、こんなかんじで色々できそうです。

wrapper() 内に処理を実装するわけですが、return する際の *args に任意のオブジェクトを追加して渡せば、view 側で request 以外に受け取れるようになったりしますです。