2016-09-21 111 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 –

相關問題