注意:从安全角度来看,禁用 CSRF 是不安全的。请根据您的判断来使用以下方法。
为什么会发生这个错误?
发生这种情况是因为默认SessionAuthentication
DRF 使用的方案。 DRF 的SessionAuthentication
使用Django的会话框架进行身份验证,需要检查CSRF。
当你没有定义任何authentication_classes
在您的视图/视图集中,DRF 使用此身份验证类作为默认值。
'DEFAULT_AUTHENTICATION_CLASSES'= (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
),
由于 DRF 需要支持对同一视图的基于会话和非会话的身份验证,因此它仅对经过身份验证的用户强制执行 CSRF 检查。这意味着只有经过身份验证的请求才需要 CSRF 令牌,并且可以在没有 CSRF 令牌的情况下发送匿名请求。
如果您将 AJAX 样式 API 与 SessionAuthentication 一起使用,则需要为任何“不安全”HTTP 方法调用包含有效的 CSRF 令牌,例如PUT, PATCH, POST or DELETE
要求。
那该怎么办呢?
现在要禁用 csrf 检查,您可以创建自定义身份验证类CsrfExemptSessionAuthentication
它从默认扩展SessionAuthentication
班级。在此身份验证类中,我们将重写enforce_csrf()
检查实际发生的情况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
to be:
authentication_classes = (CsrfExemptSessionAuthentication, BasicAuthentication)
这应该可以处理 csrf 错误。