VSCode调试FastAPI时出现CORS跨域错误但命令行运行正常的问题求助
VSCode调试FastAPI时出现CORS跨域错误但命令行运行正常的问题求助
嘿,我一眼就瞅出问题出在哪了!咱们来拆解下:
你命令行启动API时,传给uvicorn.run的是已经包装了CORSMiddleware的cors_app,但VSCode调试时,你直接指定了原始的app实例(也就是services.api.app.main:app),完全没带上那个CORS中间件!这就导致调试模式下的API根本没配置CORS规则,自然会触发跨域错误。
问题根源对比
- 命令行模式:启动的是加了CORS中间件的
cors_app - VSCode调试模式:启动的是未做任何CORS配置的原始
app
解决方法(选一个就行)
方法1:直接给原始app挂载CORS中间件(推荐)
把你的代码改成直接给app添加中间件,不用额外创建cors_app:
from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware app = FastAPI() # 直接给app挂载CORS中间件 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) # 其他路由逻辑... if __name__ == "__main__": import uvicorn uvicorn.run( app, host="0.0.0.0", port=8000, log_config=LOGGING_CONFIG, )
这样不管是命令行运行还是VSCode调试,app都会带上CORS规则。
方法2:修改VSCode的launch.json,指向包装后的cors_app
如果不想改动main.py的结构,可以在main.py末尾把cors_app暴露出来:
# 保留你原来的代码,最后加一行暴露cors_app cors_app = CORSMiddleware(app=app, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
然后修改launch.json的args:
{ "name": "Python Debugger: FastAPI", "type": "debugpy", "request": "launch", "module": "uvicorn", "args": ["services.api.app.main:cors_app", "--reload"], }
这样调试时就会启动带CORS配置的cors_app了。
方法3:用单独的启动脚本统一管理
写一个start.py脚本专门处理API启动:
from services.api.app.main import app from fastapi.middleware.cors import CORSMiddleware import uvicorn cors_app = CORSMiddleware(app=app, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]) if __name__ == "__main__": uvicorn.run( cors_app, host="0.0.0.0", port=8000, log_config=LOGGING_CONFIG, )
命令行运行python start.py,VSCode调试的话,把launch.json改成:
{ "name": "Python Debugger: FastAPI", "type": "debugpy", "request": "launch", "program": "${workspaceFolder}/start.py", "args": ["--reload"] }
这样不管哪种启动方式,用的都是同一个带CORS的实例。
试一下上面的方法,应该就能解决你的跨域问题啦!
备注:内容来源于stack exchange,提问作者Clayton Stetz
相关产品推荐
相关产品推荐

