You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI长请求出现CORS跨域错误:问题根源及修复疑问

问题场景

通过ngrok.exe http 80实现前端访问后端FastAPI接口,前端发起的数据过滤请求耗时超10分钟,但请求发起5分钟后出现跨域错误:

Access to XMLHttpRequest at 'https://0c79-37-112-0-90.eu.ngrok.io/integration/start_filter 'from origin ' Here was the url of the front' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

后端已配置完整的CORS中间件,代码如下:

from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware

from .routers.router import router

app = FastAPI()

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


app.include_router(router)

疑问点:

  • 该错误源于后端还是ngrok?
  • 能否修复?
  • 前端与Postman请求一致,但报错表现不同,原因是什么?

问题分析与解决方案

错误根源:ngrok的连接超时限制

这个错误和后端CORS配置无关,是ngrok的默认机制导致的:

  • ngrok免费版对HTTP请求的默认超时时间为5分钟,当请求处理时长超过这个阈值时,ngrok会直接断开连接,且不会向前端返回带有CORS头的响应。
  • 浏览器接收到断开的请求后,因无法获取Access-Control-Allow-Origin等必要CORS头,进而抛出跨域错误。

Postman无报错的原因

Postman不受浏览器同源策略限制,不会检查响应中的CORS头;即使ngrok断开连接,它只会显示请求超时或连接中断,不会触发跨域类报错。

修复方案

1. 升级ngrok付费版调整超时时间

ngrok付费版支持自定义HTTP请求超时,最高可设置至8小时。启动时可通过参数指定:

ngrok http 80 --request-timeout 12m

(将12m替换为你需要的时长,如1h表示1小时)

2. 优化后端接口性能

优先从根源缩短请求耗时:

  • 给数据查询添加索引、做分页处理
  • 改用FastAPI异步接口(async def定义)提升并发能力
  • 将长耗时任务拆分为异步任务(比如结合Celery+Redis),前端先拿任务ID,再轮询获取结果

3. 改用异步任务模式规避长连接

调整前后端交互逻辑:

  1. 前端发起任务启动请求,后端立即返回任务ID
  2. 后端后台执行过滤任务
  3. 前端通过轮询或WebSocket获取任务进度与最终结果

这种方式彻底避免长时间占用连接,从根源避开ngrok的超时限制。


内容的提问来源于stack exchange,提问作者Maksim Rumyantsev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:36:10