Почему мое представление 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.
.