我正在尝试从 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 中都运行得很好
请问我可能遗漏了什么?
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",