ensurecsrf_token没有在cookie选项卡中设置csrf cookie



我有一个简单的通用视图:

class GetCSRFToken(views.APIView):
permission_classes = [AllowAny, ]

@method_decorator(ensure_csrf_cookie)
def get(self, request, format=None):
return Response('csrf is set')

然后,在react中,我得到了这个代码:

useEffect(()=>{
axios.get('http://127.0.0.1:8000/csrf/').then((res)=>{
console.log(res.data)
})
},[])

因此,当react渲染具有上述效果的组件时,在cookie部分的应用程序选项卡中没有设置csrf令牌

为什么??

解决方案是使用django提供的get_token()api

来自django.middleware.csrf模块

并制作一个简单的视图,将令牌作为响应返回。

在前端(React(端,您可以创建一个效果(useEffect钩子(,或者在使用类组件的情况下挂载一个组件(componentDidMount方法(。

我将提供一个功能组件示例:

import {useEffect,useState} from 'react';

function GetCsrfComponent(){
const [token,setToken] = useState('')
useEffect(()=>{
axios.get("backend_endpoint/getcsrf/").then((res)=>{
setToken(res.data) // assuming the response is token itself
})  
},[])
return(
<input hidden value={token} type='csrfmiddleware'/>
)
}

已经创建了一个组件,您可以将该组件作为一个UI来处理,该UI可以在任何其他组件中重复使用

在后端,以下视图:

from django.middleware.csrf import get_token
from django.views.decorators.csrf import ensure_csrf_cookie
from rest_framework.response import Response
from rest_framework import viewsets, views
class GetCsrfView(views.APIView):
@method_decorator(ensure_csrf_cookie)
def get(self,request):
return Response(get_token(),status=200)
# note that i am using DRF (Django-Rest-Framework), which explains why i am returning a  `Response()` instance

而且,正如@Willem Van Onsem所提到的,ensure_csrf_token是为了确保在从客户端发送请求时发送csrf。

现在,对于urls.py:

from django_app_name import views
urlpatterns = [
path('getcsrf/',views.GetCsrfView.as_view(),name='csrf')

这应该是一个完整的示例,说明如何从后端获得csrf令牌,并在需要时发送post/create请求时使用它。

最新更新