web-dev-qa-db-ja.com

@csrf_exemptはDjango 1.4で動作を停止しました

次のコードがありますが、Django 1.2.5:

from Django.views.decorators.csrf import csrf_exempt

class ApiView(object):
    def __call__(self, request, *args, **kwargs):
        method = request.method.upper()
        return getattr(self, method)(request, *args, **kwargs)

@csrf_exempt
class MyView(ApiView):

    def POST(self):
       # (...)
       return HttpResponse(json.dumps(True), mimetype="text/javascript")

しかし、Django 1.4にアップグレードすると、「CSRF検証に失敗しました」というメッセージが表示されて403が禁止され始めました。

@csrf_exemptデコレータが機能しないのはなぜですか?

URL定義は次のとおりです。

from Django.conf.urls.defaults import *
from Django.views.decorators.csrf import csrf_exempt

import views

urlpatterns = patterns('',
   url(r'^myview/(?P<parameter_name>[A-Za-z0-9-_]+)/$',
       views.MyView(),
       name="myproject-myapp-myview",
       ),
)
16
lfagundes

Django docs によると:

クラスベースのビューのすべてのインスタンスを装飾するには、クラス定義自体を装飾する必要があります。これを行うには、デコレータをクラスのdispatch()メソッドに適用します。

したがって、次のようなことを行う必要があります。

class MyView(ApiView):

    def POST(self):
       # (...)
       return HttpResponse(json.dumps(True), mimetype="text/javascript")

    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(MyView, self).dispatch(*args, **kwargs)
22
dgel

csrf_exempturls.pyを使用するだけです。すなわち::

urls.py

..other imports...
from Django.views.decorators.csrf import csrf_exempt   
from myapp.views import MyView

urlpatterns = patterns('',
   url(r'^myview/(?P<parameter_name>[A-Za-z0-9-_]+)/$',
       csrf_exempt(MyView.as_view()), # use csrf_exempt here
       name="myproject-myapp-myview",
       ),
)
12
suhailvs

csrf_exemptは関数を装飾する必要があります。あなたのURLであなたはその関数を飾ることができます ドキュメントはここにあります

(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
3
Willian