次のコードがありますが、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",
),
)
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)
csrf_exempt
で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",
),
)
csrf_exemptは関数を装飾する必要があります。あなたのURLであなたはその関数を飾ることができます ドキュメントはここにあります 。
(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),