为什么我的DRF视图在标头中没有csrf令牌的情况下接受post请求



我刚刚开始使用Django Rest Framework,我对请求中CSRF令牌的使用有点困惑。例如,使用带有以下请求的标准Django视图将需要CSRF令牌:

fetch("http://127.0.0.1:8000/api/add_item/", {
method: "POST",
headers: {
"Content-Type": "application/json"
// "X-CSRFToken": Cookies.get("csrftoken")
},
body: JSON.stringify({ content: value })
})

但以下DRF实现似乎并不适用:

@api_view(['POST'])
def add_item(request):
serializer = ToDoSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)

这是有原因的吗?

默认情况下,DRF不使用与Django表单相同的底层身份验证。不需要CSRF令牌。

您必须为DRF单独配置身份验证。例如,启用基于会话的身份验证,您可以在settings.py文件中设置默认的身份验证类:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
# ... add other auth methods here
]
}

另请注意文档中关于DRF:中具有会话身份验证的CSRF令牌

REST框架中的CSRF验证与标准Django的工作方式略有不同,因为需要支持对相同视图的基于会话和非会话的身份验证。这意味着只有经过身份验证的请求才需要CSRF令牌,并且可以在没有CSRF令牌的情况下发送匿名请求。这种行为不适合登录视图,登录视图应始终应用CSRF验证。

最新更新