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