#reactjs #django #api #django-models
#reactjs #django #API #django-модели
Вопрос:
У меня возникла проблема, когда, когда я пытаюсь опубликовать ФОРМУ в своем API, она выдает мне эту ошибку.
Request URL: http://localhost:8000/api/
Request Method: POST
Status Code: 400 Bad Request
Remote Address: 127.0.0.1:8000
Referrer Policy: strict-origin-when-cross-origin
Я следовал руководству по созданию API, и я думаю, что это может быть проблемой, я даже не знаю, с чего начать поиск!
Я не знаю, где я ошибаюсь, и это действительно расстраивает!
Это моя страница формы REACT Post
import axios from "axios";
import { useState, useEffect } from "react";
import { useHistory } from "react-router";
import "./createpost.css";
const CreatePost = () => {
const [username, setUsername] = useState("");
const [title, setTitle] = useState("");
const [description, setDescription] = useState("");
const [image, setImage] = useState(null);
const [category, setCategory] = useState("");
const history = useHistory();
const AddPost = async () => {
let formField = new FormData();
formField.append("title", title);
formField.append("description", description);
formField.append("category", category);
if (image !== null) {
formField.append("image", image);
}
await axios({
method: "post",
url: "http://localhost:8000/api/",
data: formField,
}).then((response) => {
console.log(response.data);
history.push("/");
});
};
useEffect(() => {
if (localStorage.getItem("token") === null) {
} else {
fetch("http://127.0.0.1:8000/api/v1/users/auth/user/", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Token ${localStorage.getItem("token")}`,
},
})
.then((res) => res.json())
.then((data) => {
setUsername(data.username);
});
}
}, []);
return (
<div className="background">
<div className="post-container">
<form className="form">
<input id="user" type="text" style={{ display: "none" }} />
<input
className="createtitle"
type="text"
placeholder="Title"
value={title}
name="title"
required
onChange={(e) => setTitle(e.target.value)}
/>
<input
className="createtitle"
type="text"
placeholder="Category"
value={category}
name="category"
required
onChange={(e) => setCategory(e.target.value)}
/>
<textarea
className="createdesc"
type="text"
placeholder="Description..."
name="description"
value={description}
onChange={(e) => setDescription(e.target.value)}
/>
<div className="form-bottom">
<input
className="upload"
type="file"
name="image"
src={image}
onChange={(e) => setImage(e.target.files[0])}
/>
<button onClick={AddPost} className="createsubmit">
POST
</button>
</div>
</form>
</div>
</div>
);
};
export default CreatePost;
ЭТО МОЯ СТРАНИЦА МОДЕЛЕЙ И ПРЕДСТАВЛЕНИЙ СЕРВЕРНОГО API!
Модель:
from django.contrib.auth import get_user_model
from django.db import models
User = get_user_model()
category_choice = (
('Cook', 'Cook'),
('Coding', 'Coding'),
('Workout', 'Workout'),
('Martial Arts', 'Martial Arts'),
('Voice Lessons', 'Voice Lessons'),
)
class Post(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.CharField(max_length=100, choices=category_choice, default='')
def __str__(self):
return self.title
число просмотров
from django.http import JsonResponse
from django.shortcuts import render
# third party imports
from rest_framework import mixins
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import generics
from .serializers import PostSerializer
from .models import Post
class TestView(APIView):
permission_classes = (IsAuthenticated, )
def get(self, request, *args, **kwargs):
qs = Post.objects.all()
post = qs.first()
# serializer = PostSerializer(qs, many=True)
serializer = PostSerializer(post)
return Response(serializer.data)
def post(self, request, *args, **kwargs):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
class PostView(
mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
serializer_class = PostSerializer
queryset = Post.objects.all()
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class PostCreateView(mixins.ListModelMixin, generics.CreateAPIView):
serializer_class = PostSerializer
queryset = Post.objects.all()
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
class PostListCreateView(generics.ListCreateAPIView):
serializer_class = PostSerializer
queryset = Post.objects.all()
Комментарии:
1. Вы добавили заголовки cors в настройках django или все равно включили cors?
2. Я добавил CORS_ALLOW_ALL_ORIGINS = True в свои настройки… это неверно? @SiddharthVarangaonkar
3. вы установили django-cors-headers ?
4. pypi.org/project/django-cors-headers Я думаю, что это промежуточное программное обеспечение и модуль необходимы для прикрепления заголовка access-allowed-origin к ответу, когда браузер или клиент отправляет нам ПАРАМЕТРЫ или запрос POST
5. Да, он установлен @SiddharthVarangaonkar
Ответ №1:
внутри файла пакета react я удалил
"proxy": "http://127.0.0.1:8000"
и после этого выполняет следующие шаги:
- Установите http-proxy-промежуточное программное обеспечение
- Создать setupProxy.js файл в файле src и добавьте к нему этот код:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
app.use(
'/api',
createProxyMiddleware({
target: 'http://127.0.0.1:8000',
changeOrigin: true,
})
);
};
- запуск npm
не забудьте настроить app.используйте первый аргумент в соответствии с вашим маршрутом api.