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)
suh*_*lvs 12
只需使用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",
),
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21517 次 |
| 最近记录: |