我正在使用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令牌丢失或不正确。"
有人可以帮我解决这个问题吗?
答案 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库。