Почему 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'
Вернуться на верх