DjangoでClass-based viewを実装した際に、getだろうとpostだろうと共通で処理したくなったので実装してみた。
実装
getだろうとpostだろうとリクエストがあった場合はdispatch()を経由して呼び出される。
なのでdispatch()をmethod_decoratorを使ってラップした。
def some_decorator(dispatch):
def wrapper(request, *args, **kwargs):
# ... なんらか共通処理
return dispatch(request, *args, **kwargs)
return wrapper
@method_decorator(some_decorator, name='dispatch')
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hello, World!')
middlewareじゃだめなの?
単純なアクセスログみたいなのであればmiddlewareを実装するで良いと思う。
ただ、全てのmiddlewareが実行されたあとであることを保証したかったり、特定のViewだけログ残したかったりしたかったので。
Viewを拡張してdispatchをオーバーライドしちゃだめなの?
本当に特定の(単一の)Viewだけで実装したいのであればオーバーライドでも良いと思う。
ただ、Viewを実装する場合、実際にはTemplateViewだったりListViewだったりDetailViewだったり、django-rest-frameworkのModelViewSetだったりするわけで、それらで共通処理を実装したかったので。
バージョン
Django==1.11