Почему DRF показывает Forbidden (CSRF cookie не установлен.) без @api_view(['POST'])?
Я использую django-rest-framework (backend) и react (frontend). В react я создал форму входа, когда я отправляю форму, она посылает axios.post в мою функцию представления. Проблема в том, что django выдает ошибку и сообщение: Forbidden (CSRF cookie not set.)
>Мой аксиос:
axios({
method:'post',
url: url,
data:{email:email, password1:senha},
headers: {'X-CSRFTOKEN': token},
withCredentials: true
})
.then((response)=>{
console.log(`Reposta: ${response.data}`)
})
.catch((error)=>{
console.log(`Erro: ${error.data}`)
})
Мое представление django:
def login_usuario(request):
if request.method == 'POST':
return HttpResponse('Something')
Obs1:Если я включаю декоратор de @api_view(['POST']) работает, но я хочу знать, можно ли сделать запрос без него.
Obs2: При рендеринге моей формы react была вызвана функция, создающая csrf_token, поэтому csrf_token отправляется, но django не читает его
Возможно, что вы не включили соответствующий CSRF-токен в http-запрос axios.
Axios должен быть в состоянии добавить правильный заголовок и токен, если вы сообщите ему имя заголовка и имя cookie. Эти значения должны работать, если вы используете стандартную конфигурацию Django CSFR.
axios({
method:'post',
url: url,
data:{email:email, password1:senha},
xsrfCookieName: 'csrftoken',
xsrfHeaderName: 'X-CSRFTOKEN',
withCredentials: true
})
Чтобы убедиться, что Django установил токен csrf, вы можете использовать декоратор ensure_csrf_token
на функции представления, которая обслуживает страницу с вашим react-приложением.
from django.views.decorators.csrf import ensure_csrf_token
@ensure_csrf_token
def react_app_view(request):
return render(request, "react-app.html")
Проверить, что cookie был установлен, можно с помощью консоли javascript браузера.
> document.cookie
'csrftoken=G2fjig7PImjIcvUFa6o39fTxwRcovp6Zh5iC5pkcmhBRETliwrZ2jt6bbcrvtpKa'