Почему мое представление DRF принимает почтовые запросы без токена csrf в заголовках?

Я только начал использовать Django Rest Framework, и я немного запутался в использовании CSRF-токенов в запросах. Например, использование стандартного представления Django с приведенным ниже запросом потребует CSRF-токена:

fetch("http://127.0.0.1:8000/api/add_item/", {
    method: "POST",
    headers: {
        "Content-Type": "application/json"
        // "X-CSRFToken": Cookies.get("csrftoken")
    },
    body: JSON.stringify({ content: value })
})

Но не похоже, что это так с приведенной ниже реализацией DRF:

@api_view(['POST'])
def add_item(request):
    serializer = ToDoSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)

Есть ли для этого причина?

DRF по умолчанию не использует ту же базовую аутентификацию, что и формы Django. Токены CSRF не ожидаются.

Вы должны настроить аутентификацию для DRF отдельно. Например, включив аутентификацию на основе сеанса, вы можете установить классы аутентификации по умолчанию в вашем settings.py файле:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        # ... add other auth methods here
    ]
}

Также обратите внимание из документации относительно CSRF токенов с сессионным аутентификатором в DRF:

CSRF валидация в REST фреймворке работает несколько иначе, чем в стандартном Django, из-за необходимости поддержки как сессионной, так и не сессионной аутентификации для одних и тех же представлений. Это означает, что только аутентифицированные запросы требуют CSRF-токенов, а анонимные запросы могут быть отправлены без CSRF-токенов. Такое поведение не подходит для представлений входа в систему, к которым всегда должна применяться проверка CSRF.

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