@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())),