【Django】クラスベースビューで特定のHTTPリクエストのみ受け付ける方法

Django

スポンサーリンク

Djangoのクラスベースビューで特定の(GETやPOST)などのHTTPリクエストのみを受け付けるやり方を記載します。

2パターンあります。

①デコレータを使用

②スーパークラスの変数を上書きする

どちらも、レスポンスは405ステータスを返します。

2パターンを順に紹介します。

①デコレータを使用

[views.py]

from django.utils.decorators import method_decorator
from django.views.decorators.http import require_POST

@method_decorator(require_POST, name='dispatch')
class OnlyPost(UpdateView):
    """ POSTのみ受け付ける """

    def post(self, request, *args, **kwargs):

「@method_decorator(require_POST, name=’dispatch’)」を使用して、関数デコレータをクラスに適用させます。

関数デコレータをクラスベースビューに適用させる方法は以下を参照

②スーパークラスの変数を上書きする

[views.py]

class OnlyPost(UpdateView):
    """ POSTのみ受け付ける """
    http_method_names = ['post']

    def post(self, request, *args, **kwargs):

「http_method_names = ['post’]」とするとPOSTのみを受け付けるようになる。

ちなみになぜ、「http_method_names = ['post’]」にいれたHTTPメソッドしか受け付けなくなるかというと、

継承しているUpdateViewクラスを追いかけていくと、

UpdateView←BaseUpdateView←ProcessFormView←Viewというように継承しています。

一番上(親)のクラスである、Viewを見ると、以下のようになっています。

[View]※一部抜粋

class View:
    """
    Intentionally simple parent class for all views. Only implements
    dispatch-by-method and simple sanity checking.
    """

    http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

----以下省略----

http_method_names = ['get’, 'post’, 'put’, 'patch’, 'delete’, 'head’, 'options’, 'trace’]

上記のこの変数に各種の許可するHTTPメソッドが書いています。

このhttp_method_names変数をViewクラス内の関数で処理をして許可する許可しないを決めています。※細かい処理はここでは紹介しないので興味があればご自分で調べてください。

というわけで、許可するHTTPメソッドだけをhttp_method_names変数にいれてViews.pyで定義してあげればよいのです。

以上です。

Django

Posted by ton