Ensure_csrf_token не устанавливает cookie csrf на вкладке cookies

У меня есть простой общий вид:

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 рендерит компонент, который имеет эффект выше, токен csrf не устанавливается на вкладке приложения в разделе cookie

почему это???

Решением было использовать get_token() api, который предоставляет django,

из 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'/>
 )
}

Создан компонент, вы можете работать с этим компонентом как с частью пользовательского интерфейса, которая может быть повторно использована в любом другом компоненте

на стороне бэкенда, следующий вид:

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, когда это необходимо.

Вернуться на верх