@csrf_exempt停止在Django 1.4中工作

lfa*_*des 16 python django csrf django-csrf

我有以下代码,在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")
Run Code Online (Sandbox Code Playgroud)

但是当我升级到Django 1.4时,我开始禁止403,"CSRF验证失败"消息.

为什么@csrf_exempt装饰工作不起作用?

网址定义是:

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",
       ),
)
Run Code Online (Sandbox Code Playgroud)

dge*_*gel 22

根据django文档:

要装饰基于类的视图的每个实例,您需要修饰类定义本身.为此,您可以将装饰器应用于类的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)
Run Code Online (Sandbox Code Playgroud)

  • 由于海报在大写字母中使用 POST,我认为他没有使用基于 django 类的视图 (2认同)
  • 即使对于基于类的视图,这也无论如何都行不通.根据文档,你必须在method_decorator装饰器中包装csrf_exempt装饰器:`@method_decorator(csrf_exempt)` (2认同)

suh*_*lvs 12

只需使用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",
       ),
)
Run Code Online (Sandbox Code Playgroud)