我面临的问题是我无法从我的NextJS前端获取现有用户。我使用的后端框架是Django(沿着django-cors-headers包)。django-cors-headers不允许特定的HTTP请求,而它应该。
我的next.config.js包含重写,以便我可以访问我的后端。
async redirects() {
return [
{
source: '/api/:path*',
destination: 'http://localhost:8000/:path*/',
permanent: true,
},
]
},
我的django-cors-headers设置看起来像这样:
# CORS
CSRF_TRUSTED_ORIGINS = [
'http://localhost:3000',
]
CORS_ALLOWED_ORIGINS = [
'http://localhost:3000',
'http://localhost:8000',
'http://127.0.0.1:3000',
'http://127.0.0.1:8000',
]
CORS_ALLOW_ALL_ORIGINS = True
失败的请求尝试获取ID为1的用户。此用户已存在,因此此请求应成功。
fetch(`/api/users/${String(userId)}/`, {
mode: 'cors',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
},
})
然而,我从请求中得到的唯一结果是一条关于CORS的错误消息。
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8000/users/1.
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Status code: 301.
看起来我的django-cors-headers设置错误。但我可以获得我的JWT代币。以下请求成功。
fetch('/api/token', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: mail,
password,
}),
})
4条答案
按热度按时间aelbi1ox1#
我几乎尝试了所有的方法,除了仔细检查我的中间件的加载顺序。我通过从以下加载顺序修复了我的问题
。。。到
我知道这必须是简单的事情,但现在我只是觉得自己像个大白痴...
vhmi4jdf2#
这是django cors header的设置。单位:
settings.py
Status code: 301
表示请求的资源无效,因此请求应重定向到正确的URL。很可能您正在向无效的端点发送请求umuewwlo3#
对于CORS,我们有几件事需要考虑。你可以在这里找到更多:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers,转到访问控制链接。
你上面的配置,你已经设置好了:
因此,如果您的应用使用凭据,请将CORS_ALLOW_CREDENTIALS更改为True。如果它仍然不起作用,请检查您的请求头,确保其中没有特殊的头,如果您的请求中有特殊的头,最好在CORS_ALLOW_HEADERS内。
bvhaajcl4#
我也有同样的问题,我试图在react app中调用Django API,这个错误困扰了我几天,但我找到了解决方案。
1.首先检查网络上所有建议的解决方案,例如:在Django中安装corsheaders,并将其添加到setting.py中的安装应用程序和MIDDLEWARE中。所以下一步:在任何浏览器中打开网络选项卡,我们必须检查两个重要的标题。在请求期间。1.请求报头中的访问控制请求报头。2.响应头中的Access-Control-Allow-Headers。
1.如图所示,请求头中的Access-Control-Request-Headers是content-type,但响应中的Access-Control-Allow-Headers是http://localhost:3000,content-type。这就是问题所在。enter image description here
1.要解决这个问题,请转到settings.py,在后端检查CORS_ALLOW_HEADERS并删除除'content-type'之外的所有内容。所以再查一遍我的窃听器不见了。