Django Rest Framework Forbidden при отправке почтового запроса
Я делаю сайт с бэкендом на базе django rest framework и фронтендом на базе react, но когда я использую axios для отправки запроса post в /products, он отправляет ошибку 403 forbidden error
это файл представлений
@api_view(['GET', 'POST'])
def products(request):
if request.method == 'GET':
products = Product.objects.all()
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ProductSerializer(data=request.data)
print(request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
вот как я отправляю запрос в react:
const handleSave = () => (
axios.post('/products', getInputData()).then((response) => (console.log(response)))
);
вот мой файл настроек в django:
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'rest_framework',
'API',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'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 = False
CORS_ORIGIN_WHITELIST = (
'http://localhost:3000',
)
<script>
let form = document.getElementById('form'); // selecting the form
form.addEventListener('submit', function(event) { // 1
event.preventDefault()
let data = new FormData(); // 2
data.append("title", document.getElementById('title').value)
data.append("note", document.getElementById('note').value)
data.append("csrfmiddlewaretoken", '{{csrf_token}}') // 3
axios.post('create_note/', data) // 4
.then(res => alert("Form Submitted")) // 5
.catch(errors => console.log(errors)) // 6
})
</script>
Приведенный выше код:
1 - Добавляет слушателя события submit к форме.
2 - Создает новую форму в JavaScript.
3 - Добавляет токен CRSF. Если мы не включим его, то получим ответ 403 forbidden и не сможем отправить данные формы.
4 - Здесь мы используем метод axios.post для отправки данных формы.
5 - Если форма успешно отправлена, в вашем браузере появляется сообщение Form Submitted.
6 - Перехватывает и выводит ошибку в консоль, если при отправке формы произошла ошибка.
Теперь используйте этот код в соответствии с вашими данными и потребностями.
вот что я в итоге сделал
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function add_product(data) {
const csrftoken = getCookie('csrftoken');
const config = {
headers: {
'content-type': 'application/json',
'X-CSRFToken': csrftoken,
}
}
axios.post('/products', data, config).then((response) => (alert(response))
}