为什么获取CORS错误原因:CORS请求未成功

2024-05-14 18:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个小巧的应用程序,它使用FastAPI后端与PostgreSQL数据库交互,PostgreSQL数据库是我所在组织的本地数据库,而不是我的AWS EC2实例

我使用javascript的fetch api向后端发送请求,以查询数据库中的各种内容,在我的本地计算机上,所有这些请求都在两端接收,在AWS上,但是来自前端的请求甚至不能被fastAPI后端识别

我在设置这样的服务器方面相当缺乏经验,因此我假设在设置这些服务器时存在一些基本错误,使得它们之间在AWS上无法进行这样的通信

fastapi代码如下所示:

import uvicorn
from fastapi import (Depends, FastAPI, HTTPException, Query,
                     Request)
from fastapi.middleware.cors import CORSMiddleware


app = FastAPI(debug=True)

origins = [
    '*'
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def root():
    return {"message": "Hello World"}

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)

我的提取请求通常如下所示:

const endpoint = public_IP:8000 + `/`;

let objs = [];

fetch(endpoint)
    .then(response => {
        if (!response.ok) {
            throw Error(response.statusText);
        }
        return response.json();
    })

当我发送一个像上面那样的获取请求时,我得到一个CORS错误,原因是:CORS请求没有成功。FastAPI服务器没有反馈,请求似乎从未到达,我不确定为什么。据我所知,这通常与HTTP和HTTPS请求之间的问题有关,但这些似乎与我的问题无关,因为我的设置中没有一部分不使用HTTP。当使用chrome时,我得到一个错误:加载资源失败:net::ERR\u连接也被拒绝

我的EC2实例的AWS安全组允许从任何IP到端口5000和8000的TCP流量。这是我的两个应用程序的托管地,分别是Svelte和FastAPI


Tags: 实例importaws数据库app应用程序responsepostgresql
2条回答

总结

CORS错误有时会令人困惑,因为错误信息不够清楚,并且有很多可能的解决方案

第一种可能性

  • 如果您从给定主机(在您的情况下为0.0.0.0)加载页面,然后尝试向另一个主机(例如127.0.0.1)发出请求,则请求将被阻止以防止XSS攻击

将主机从0.0.0.0更改为127.0.0.1应该可以解决此问题

第二种可能性

如果您是Mozilla人,Mozilla中存在bug[seesee],但如果是这种情况,您的代码应该在其他浏览器中工作

解决方案:您必须在每个端口上单独启用证书。

其他可能性

请尝试更改您的端点

const endpoint = public_IP:8000 + `/`;

对此

const endpoint = `/`;

您在fastapi应用程序中的端点很可能引发异常。出现这种情况时,通过app.add_middleware(...)安装的CORSMiddleware看不到任何HTTP响应,并且没有机会对FastAPI错误处理程序生成的HTTP响应执行其工作

解决方案是使用CorsMiddle软件包装整个FastAPI应用程序,如下所示:

import uvicorn
from fastapi import (Depends, FastAPI, HTTPException, Request
from fastapi.middleware.cors import CORSMiddleware


app = FastAPI(debug=True)

origins = [
    '*'
]


@app.get("/")
async def root():
    return {"message": "Hello World"}


app = CORSMiddleware(
    app=app,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8000)

相关问题 更多 >

    热门问题