FastAPI + Flask 混合部署最佳实践。解决路由定义、API 代理等常见问题。适用于需要同时运行 FastAPI API 和 Flask 前端的场景。
当你需要同时运行 FastAPI 后端 API 和 Flask 前端服务时,需要注意以下关键问题。
┌─────────────────────────────────────────┐
│ 用户浏览器 │
└─────────────────┬───────────────────────┘
│ :15000
▼
┌─────────────────────────────────────────┐
│ Flask (端口 15000) │
│ - 静态页面 │
│ - API 代理 → FastAPI │
└─────────────────┬───────────────────────┘
│ 内部调用
▼
┌─────────────────────────────────────────┐
│ FastAPI (端口 18000) │
│ - REST API │
│ - 业务逻辑 │
└─────────────────────────────────────────┘
问题: 路由定义在 if name == main: 之后,导致路由未被注册。
错误示例:
python
from fastapi import FastAPI
app = FastAPI()
if name == main:
import uvicorn
uvicorn.run(app, host=0.0.0.0, port=18000)
正确示例:
python
from fastapi import FastAPI
app = FastAPI()
if name == main:
import uvicorn
uvicorn.run(app, host=0.0.0.0, port=18000)
问题: 前端通过 Flask (15000端口) 访问,但 API 在 FastAPI (18000端口),存在跨域问题。
解决方案: 在 Flask 中添加 API 代理。
python
from flask import Flask, request, Response
import requests
app = Flask(name)
FASTAPI_BASE = http://localhost:18000
问题: 新增的模型类在路由文件中未导入,导致 NameError。
解决方案: 确保所有使用的类都已导入。
python
class Trajectory(Base):
tablename = trajectories
id = Column(Integer, primary_key=True)
# ...
class Annotation(Base):
tablename = annotations
id = Column(Integer, primary_key=True)
trajectory_id = Column(Integer, ForeignKey(trajectories.id))
# ...
python
@app.delete(/api/trajectories/{trajectory_id})
def deletetrajectory(trajectoryid: int, db: Session = Depends(get_db)):
# 现在可以正确访问所有模型
annotation = db.query(Annotation).filter(
Annotation.trajectoryid == trajectoryid
).first()
# ...
问题: 删除主记录时,关联的外键记录如何处理?
方案 A: 数据库级联删除(推荐)
python
class Trajectory(Base):
tablename = trajectories
id = Column(Integer, primary_key=True)
annotations = relationship(Annotation, cascade=all, delete-orphan)
方案 B: 手动删除关联记录
python
@app.delete(/api/trajectories/{trajectory_id})
def deletetrajectory(trajectoryid: int, db: Session = Depends(get_db)):
# 先删除关联的 annotations
db.query(Annotation).filter(
Annotation.trajectoryid == trajectoryid
).delete()
# 再删除主记录
trajectory = db.query(Trajectory).filter(
Trajectory.id == trajectory_id
).first()
if trajectory:
db.delete(trajectory)
db.commit()
return {status: deleted}
bash
#!/bin/bash
yaml
version: 3.8
services:
api:
build: .
command: python -m uvicorn api:app --host 0.0.0.0 --port 18000
ports:
- 18000:18000
web:
build: .
command: python frontend.py
ports:
- 15000:15000
depends_on:
- api
environment:
- FASTAPI_URL=http://api:18000
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 fastapi-flask-proxy-1775912044 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 fastapi-flask-proxy-1775912044 技能
skillhub install fastapi-flask-proxy-1775912044
文件大小: 3.02 KB | 发布时间: 2026-4-12 09:55