我有一个简单的通用视图:
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请求时使用它。