为什么我从 Django Rest Framework 收到 301 和 CORS 响应,而请求在 Postman 中运行良好?

问题描述 投票:0回答:1

我正在尝试从 React 和 Redux 应用程序向 Django 应用程序发出 API GET 请求,但收到有关 CORS 的错误以及 301 响应。以下是回应

这里是 React & Redux 代码:

const fetchClasses = createAsyncThunk(
  GET_CLASSES,
  async (id) => {
    const CLASSES_API = `http://127.0.0.1:8000/learning/classes?schoolPk=${id}`;
    const response = await fetch(CLASSES_API);
    const data = await response.json();
    return data;
  },
);

当我使用相同的代码获取所有学校时,它起作用了。但是当我添加 id 参数以获取某所学校的所有课程时,这就是我遇到错误的时候。 下面是 Django 中的 views.py 代码。

# Create your views here.
class SchoolViewSet(viewsets.ModelViewSet):
   queryset = School.objects.all()
   serializer_class = SchoolSerializer

class ClassViewSet(viewsets.ModelViewSet):
serializer_class = ClassSerializer

def get_queryset(self):
    return Class.objects.filter(school=self.request.query_params['schoolPk'])

我尝试在 Django settings.py 文件中设置 CORS。

ALLOWED_HOSTS = ['http://localhost:3000/', '127.0.0.1',]

CORS_ALLOWED_ORIGINS = ['http://localhost:3000',]


CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000',
)

CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_METHODS = [
    "DELETE",
    "GET",
    "OPTIONS",
    "PATCH",
    "POST",
    "PUT",
]

CORS_ALLOW_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
]

CORS_EXPOSE_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
]

CORS_ALLOW_CREDENTIALS = True

我想我可能在 React 中遗漏了一些东西,因为每个请求在 Postman 中都运行得很好

请问我可能遗漏了什么?

reactjs django redux django-rest-framework redux-thunk
1个回答
1
投票

CORS 用于保护客户端免受 cookie 窃取,邮递员不是客户端。这就是为什么你不会从邮递员那里得到错误。

在settings.py中

INSTALLED_APPS = [
    //..
    'corsheaders',
    'rest_framework',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    
]


ALLOWED_HOSTS = ["127.0.0.1","localhost"]

如果那些没有解决它,在 package.json 添加代理

  "proxy": "http://127.0.0.1:8000",
© www.soinside.com 2019 - 2024. All rights reserved.