3 回答

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
為什么會(huì)出現(xiàn)這種錯(cuò)誤?
這是因?yàn)?code>SessionAuthenticationDRF使用的默認(rèn)方案。DRF SessionAuthentication
使用Django的會(huì)話框架進(jìn)行身份驗(yàn)證,需要檢查CSRF。
如果未authentication_classes
在視圖/視圖集中定義任何內(nèi)容,DRF將使用此身份驗(yàn)證類作為默認(rèn)值。
'DEFAULT_AUTHENTICATION_CLASSES'= ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication'),
由于DRF需要同時(shí)支持對(duì)相同視圖的會(huì)話和非會(huì)話身份驗(yàn)證,因此它僅對(duì)經(jīng)過(guò)身份驗(yàn)證的用戶執(zhí)行CSRF檢查。這意味著只有經(jīng)過(guò)身份驗(yàn)證的請(qǐng)求才需要CSRF令牌,并且可以在沒(méi)有CSRF令牌的情況下發(fā)送匿名請(qǐng)求。
如果您使用帶有SessionAuthentication的AJAX樣式API,則需要為任何“不安全”HTTP方法調(diào)用(例如PUT, PATCH, POST or DELETE
請(qǐng)求)包含有效的CSRF令牌。
該怎么辦?
現(xiàn)在要禁用csrf檢查,您可以創(chuàng)建一個(gè)CsrfExemptSessionAuthentication
從默認(rèn)SessionAuthentication
類擴(kuò)展的自定義身份驗(yàn)證類。在此身份驗(yàn)證類中,我們將覆蓋enforce_csrf()
實(shí)際內(nèi)部發(fā)生的檢查SessionAuthentication
。
from rest_framework.authentication import SessionAuthentication, BasicAuthentication class CsrfExemptSessionAuthentication(SessionAuthentication): def enforce_csrf(self, request): return # To not perform the csrf check previously happening
在您的視圖中,您可以將其定義authentication_classes
為:
authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication)
這應(yīng)該處理csrf錯(cuò)誤。
添加回答
舉報(bào)