РЕАГИРУЕТ на отправку формы DJANGO на ошибку строгого происхождения API 400 при перекрестном происхождении

#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"
 

и после этого выполняет следующие шаги:

  1. Установите http-proxy-промежуточное программное обеспечение
  2. Создать 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,
    })
  );
};
 
  1. запуск npm

не забудьте настроить app.используйте первый аргумент в соответствии с вашим маршрутом api.