LoginSignup
4
4

More than 5 years have passed since last update.

Class-based Viewへのリクエスト時の共通処理

Last updated at Posted at 2017-04-06

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4