2016-09-21 91 views
0

我使用Django rest框架中的UpdateModelMixin更新测试模型中的条目。“CSRF失败:CSRF令牌丢失或不正确。”在Django Rest中:UpdateModelMixin

from django.utils.decorators import method_decorator 
from django.views.decorators.cache import never_cache 
from rest_framework import mixins, filters, viewsets 
decorators = [never_cache] 

@method_decorator(decorators, name='dispatch') 
class TestViewSet(mixins.ListModelMixin, 
        mixins.RetrieveModelMixin, 
        mixins.UpdateModelMixin, 
        viewsets.GenericViewSet): 

    queryset = Test.objects.all() 
    serializer_class = TestSerializer 
    filter_backends = [filters.DjangoFilterBackend] 
    filter_class = TestFilter 

当我尝试更新从测试模型它给下面的错误的对象 -

“细节”:“CSRF失败:CSRF令牌丢失或不正确。”

任何人都可以请帮我解决这个问题吗?

回答

4

这是一个古老的问题,但它值得回答,因为人们可能会来此页寻找一个。

如果存在csrf标记问题,则表示您正在使用的页面未传递csrf标记。既然你没有说你如何访问数据,我会假设它是JavaScript,因为这很可能,所以我给你举例说明如何修正它,但这个过程很简单来自现有cookie的csrf标记,然后将其作为cookie传递给API。

这是从JavaScript为例AJAX调用传递CSRF令牌:

var data={ foo: "bar" }; 
$.ajax({ 
    url: '/api/schedule/', 
    type: "PATCH", 
    data: JSON.stringify(data), 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader('X-CSRFToken', Cookies.get('csrftoken')) 
    }, 
    contentType: "application/json", 
}); 

编辑: 它使用JavaScript的饼干库。

+0

Cookie未定义。我完全是html的noob。我从哪里得到Cookies。 –

+1

对不起。我没有提到你必须为这个代码包含JavaScript cookie库。 –

+0

是否做到了。谢谢 - https://github.com/js-cookie/js-cookie/blob/latest/src/js.cookie.js –

相关问题