@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, я начал получать запрет на 403 с сообщением "CSRF verification failed".

Почему этот обработчик @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",
       ),
)

Ответы

Ответ 1

В соответствии с 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)

Ответ 2

Просто используйте csrf_exempt в urls.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",
       ),
)

Ответ 3

csrf_exempt должен украсить функцию. В ваших URL-адресах вы можете украсить эту функцию, docs можно найти здесь.

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