" CSRF失败:CSRF令牌丢失或不正确。"在Django Rest中:UpdateModelMixin

时间:2016-09-21 12:10:13

标签: django django-rest-framework

我正在使用Django rest框架中的UpdateModelMixin来更新Test模型中的条目。

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令牌丢失或不正确。"

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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 cookie库。