DRF Forbidden (CSRF cookie не установлен.) из POST-запроса React axios
Как мы знаем, по умолчанию у нас нет доступа к Django CSRFToken
в React, поэтому нам нужно как-то его получить.
Решением было сделать URL для получения CSRFToken
в Response-Headers
и установить csrftoken
cookie в браузере. Так я и сделал =>
Views.py
@method_decorator(ensure_csrf_cookie, name='dispatch')
class GetCSRFToken(APIView):
permission_classes = (permissions.AllowAny, )
def get(self, request, format=None):
return Response("CSRF cookie set.")
CSRFToken.jsx
import React, { useState, useEffect} from 'react';
import axios from 'axios';
export default function CSRFToken(){
useEffect(()=>{
const fetchData = async () => {
try {
const url = 'http://localhost:8000/csrf_cookie'
const response = await axios.get(url,{
withCredentials: true,
}).then(()=>{
console.log("CSRF Cookie set.")
})
} catch (error) {
console.error('Error fetching data:', error);
}
};
fetchData();
}, []);
return (
<>
</>
)
}
Результат =>
После этого мы можем получить доступ к csrftoken
и можем отправить его через X-CSRFToken
Request-Headers
.
Но проблема в том, что когда я посылаю запрос , сторона Django не принимает этот csrftoken
и отклоняет его.
settings.py
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'App.apps.AppConfig'
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CSRF_TRUSTED_ORIGINS = ['http://localhost:5173']
Views.py
@method_decorator(csrf_protect, name='dispatch')
class MarketDataView(APIView):
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
...
FetchMarketData.js
export const fetchMarketData = createAsyncThunk(
'market/fetchData',
async ({requestData, csrftoken}, thunkApi) => {
try {
const url = 'http://localhost:8000/api/market'
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrftoken
},
body: JSON.stringify({
exchange: 'binance'
}),
});
return await response.json();
} catch (error) {
return thunkApi.rejectWithValue(error);
}
}
);
Заголовки запросов и ответы Django =>
Как я могу решить эту проблему, ребята?