![](/img/trans.png)
[英]Blocked by CORS policy: No 'Access-Control-Allow-Origin'. The backend has set the relevant header or the same
[英]Backend Returns "Access-Control-Allow-Origin" Header Twice, Each With Different Value
我正在使用 Python 的 FastAPI 在我的前端管理服务器的 API 和 Axios 挂钩。
这是我的代码片段,用于处理服务器上 CORS 策略的详细信息:
origins = ["http://localhost:3000"]
*****some code here*****
app = FastAPI(
title=settings.PROJECT_NAME,
version="1.0",
docs_url=f"{settings.API_V1_STR}/docs",
openapi_url=f"{settings.API_V1_STR}/openapi.json",
)
app.container = app
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(api_router, prefix=settings.API_V1_STR)
这是我通过 Axios-hooks axios-hooks 文档在前端使用的相关钩子:
const [
{
response: marketResponse,
loading: marketLoading,
error: marketError,
},
] = useAxios({
url: serverURL("market/list"),
method: "GET",
});
重要的是要注意我已经仔细检查了允许的来源。
问题:
由于我的 web 应用程序通过上述 axios 钩子请求列表,出现以下错误:
这是网络选项卡的 Header 信息:
正如您会注意到的那样,Access-Control-Allow-Origin 出现了 2 次。 一次是大写的初始字母,第二次是全部小写。 我认为这个问题不知何故源于这个标题。 不幸的是找不到修复它的特定方法。
感谢您提供任何帮助!
用谷歌搜索了多个类似的问题并研究了 Axios 和 Fast Api 文档。 不幸的是,连一点点解决办法都找不到。
这实际上是Starlette CORSMiddleware的一个已知问题。 所以问题是 Starlette CORSMiddleware 添加了原点 header 而没有检查它是否已经存在。 这是设计使然。
FastAPI 正在包装这个模块。
如果您查看实际的 Starlette 代码,您会发现它位于这一行。
这解释了Access-Control-Allow-Origin
的大写版本。
多个服务器正在运行。 一个已知问题是,如果您使用的是python-socketio
,则 socketio 将添加自己的 header 版本。
我注意到这一行:
app.container = app
这是什么原因? 您可以尝试将其注释掉并重新运行代码吗?
否则检查您的 NGINX 是否设置为 CORS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.