from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
# 创建 FastAPI 应用
app = FastAPI(
title="Ask SQL API",
description="Natural language to SQL with Agno Workflow and AI Chat",
version="1.0.0",
)
# 验证必要的环境变量
required_env_vars = ["OPENAI_API_KEY"]
missing_vars = [var for var in required_env_vars ifnot os.getenv(var)]
if missing_vars:
raise ValueError(f"缺少必要的环境变量: {', '.join(missing_vars)}")
阅读时间:约 7 分钟 难度级别:实战 前置知识:Python 基础、HTTP 协议基础
本节概要 通过本节学习,你将掌握:
使用 Vibe Coding 设计和创建项目结构 FastAPI 应用的基础配置和启动 CORS 跨域配置的正确方法 创建健康检查和基础路由 自动生成 API 文档的使用 项目的测试和验证方法
引言 从本节开始,我们将进入实战环节。txt
Step 2: 创建主应用文件 与 AI 对话: 创建 main.CubeJS 配置 CUBEJS_URL=http://localhost:4000
应用配置
APP_ENV=development LOG_LEVEL=INFO
.
第 7 节:搭建 FastAPI 基础框架
本节概要
通过本节学习,你将掌握:
引言
从本节开始,我们将进入实战环节。首先从搭建 FastAPI 基础框架开始,这是整个后端系统的基石。我们将使用 Vibe Coding 的方式,通过与 AI 对话来快速搭建项目结构。
🎯 本章目标
完成后,你将拥有:
📁 项目结构设计
使用 Vibe Coding 创建结构
与 AI 的对话:
我要创建一个 FastAPI 项目,用于构建 Text-to-BI 系统。 项目结构需求: - backend/ 作为后端根目录 - 使用模块化设计,分离路由、服务、Agent - 支持环境变量配置 - 包含依赖管理文件 请帮我设计项目结构并创建必要的文件。AI 生成的结构:
backend/ ├── main.py # FastAPI 主应用 ├── requirements.txt # Python 依赖 ├── .env # 环境变量 ├── .env.example # 环境变量示例 ├── .gitignore # Git 忽略文件 ├── start.sh # 启动脚本 ├── routers/ # API 路由 │ ├── __init__.py │ ├── chat.py # 聊天路由 │ └── workflow.py # Workflow 路由 ├── agents/ # AI Agent │ ├── __init__.py │ └── cubejs_agent.py ├── services/ # 外部服务 │ ├── __init__.py │ └── cubejs_service.py ├── workflows/ # Workflow 定义 │ ├── __init__.py │ └── text_to_bi.py └── tmp/ # 临时文件 └── workflows.db # Workflow 存储🚀 创建主应用
Step 1: 安装依赖
与 AI 对话:
创建 requirements.txt,包含以下依赖: - FastAPI:Web 框架 - Uvicorn:ASGI 服务器 - Agno:AI Agent 框架 - Python-dotenv:环境变量管理 - Requests:HTTP 客户端 - PyYAML:YAML 解析 请列出具体的版本号。生成的 requirements.txt:
安装依赖:
cd backend python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txtStep 2: 创建主应用文件
与 AI 对话:
创建 main.py,要求: 1. 创建 FastAPI 应用实例 2. 配置 CORS,允许前端访问 3. 添加根路径和健康检查接口 4. 包含 API 文档配置 5. 添加启动代码 前端运行在 http://localhost:5173生成的 main.py:
""" Ask SQL Backend - 主应用 整合了基础聊天和 Text-to-BI Workflow 功能的 FastAPI 应用 """ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware # 创建 FastAPI 应用实例 app = FastAPI( title="Ask SQL API", description="Natural language to SQL with Agno Workflow and AI Chat", version="1.0.0", docs_url="/docs", redoc_url="/redoc", ) # 配置 CORS 中间件 app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:5173", "http://127.0.0.1:5173", "http://localhost:3000", "http://127.0.0.1:3000", ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") def read_root(): """ 根路径 - 健康检查和 API 信息 """ return { "status": "ok", "service": "Ask SQL API", "version": "1.0.0", "endpoints": { "docs": "/docs", "redoc": "/redoc", } } @app.get("/health") def health_check(): """ 健康检查端点 """ return { "status": "healthy", "service": "ask-sql-backend" } if __name__ == "__main__": import uvicorn uvicorn.run( "main:app", host="0.0.0.0", port=8000, reload=True )Step 3: 测试基础应用
启动服务:
测试接口:
# 测试根路径 curl http://localhost:8000/ # 测试健康检查 curl http://localhost:8000/health # 访问 API 文档 open http://localhost:8000/docs预期输出:
{ "status": "ok", "service": "Ask SQL API", "version": "1.0.0", "endpoints": { "docs": "/docs", "redoc": "/redoc" } }🔧 配置环境变量
Step 1: 创建环境变量文件
与 AI 对话:
创建 .env.example 文件,包含: - OpenAI API Key(用于 AI 模型) - CubeJS URL - 其他必要的配置 同时创建 .gitignore,确保 .env 不被提交。.env.example:
# AI 模型配置 OPENAI_API_KEY=your_api_key_here # CubeJS 配置 CUBEJS_URL=http://localhost:4000 # 应用配置 APP_ENV=development LOG_LEVEL=INFO.gitignore:
# Python __pycache__/ *.py[cod] *$py.class *.so .Python venv/ env/ # 环境变量 .env # 数据库 *.db *.sqlite # IDE .vscode/ .idea/ *.swp *.swo # 临时文件 tmp/ *.logStep 2: 加载环境变量
修改 main.py:
from dotenv import load_dotenv import os # 加载环境变量 load_dotenv() # 创建 FastAPI 应用 app = FastAPI( title="Ask SQL API", description="Natural language to SQL with Agno Workflow and AI Chat", version="1.0.0", ) # 验证必要的环境变量 required_env_vars = ["OPENAI_API_KEY"] missing_vars = [var for var in required_env_vars if not os.getenv(var)] if missing_vars: raise ValueError(f"缺少必要的环境变量: {', '.join(missing_vars)}")📝 创建路由模块
Step 1: 创建基础聊天路由
与 AI 对话:
在 routers/chat.py 中创建一个基础的聊天接口: - POST /chat/ask - 接收 message 参数 - 返回简单的响应 - 使用 Pydantic 模型验证输入routers/chat.py:
""" 聊天路由 - 基础 AI 聊天功能 """ from fastapi import APIRouter from pydantic import BaseModel router = APIRouter( prefix="/chat", tags=["chat"] ) class ChatRequest(BaseModel): """聊天请求模型""" message: str class ChatResponse(BaseModel): """聊天响应模型""" response: str @router.post("/ask", response_model=ChatResponse) async def ask(request: ChatRequest): """ 基础聊天接口 Args: request: 包含用户消息的请求 Returns: AI 的响应 """ # 暂时返回简单响应 return ChatResponse( response=f"收到消息: {request.message}" )Step 2: 注册路由
修改 main.py:
from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from dotenv import load_dotenv # 导入路由 from routers import chat load_dotenv() app = FastAPI( title="Ask SQL API", description="Natural language to SQL with Agno Workflow and AI Chat", version="1.0.0", ) # 配置 CORS app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:5173", "http://127.0.0.1:5173", ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # 注册路由 app.include_router(chat.router) @app.get("/") def read_root(): return { "status": "ok", "service": "Ask SQL API", "version": "1.0.0", "endpoints": { "docs": "/docs", "chat": { "ask": "POST /chat/ask - 基础 AI 聊天" } } }Step 3: 测试聊天接口
# 测试聊天接口 curl -X POST "http://localhost:8000/chat/ask" \ -H "Content-Type: application/json" \ -d '{"message": "Hello"}'预期输出:
{ "response": "收到消息: Hello" }🎨 创建启动脚本
与 AI 对话:
创建 start.sh 启动脚本,包含: 1. 激活虚拟环境 2. 检查环境变量 3. 启动 uvicorn 服务器 4. 支持热重载start.sh:
#!/bin/bash # 颜色定义 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color echo -e "${GREEN}=== Ask SQL Backend 启动脚本 ===${NC}\n" # 检查虚拟环境 if [ ! -d "venv" ]; then echo -e "${RED}错误: 虚拟环境不存在${NC}" echo "请先运行: python -m venv venv" exit 1 fi # 激活虚拟环境 echo -e "${YELLOW}激活虚拟环境...${NC}" source venv/bin/activate # 检查 .env 文件 if [ ! -f ".env" ]; then echo -e "${YELLOW}警告: .env 文件不存在${NC}" echo "请复制 .env.example 并配置必要的环境变量" echo "cp .env.example .env" exit 1 fi # 检查依赖 echo -e "${YELLOW}检查依赖...${NC}" pip list | grep fastapi > /dev/null if [ $? -ne 0 ]; then echo -e "${YELLOW}安装依赖...${NC}" pip install -r requirements.txt fi # 启动服务器 echo -e "${GREEN}启动 FastAPI 服务器...${NC}" echo -e "访问 API 文档: ${GREEN}http://localhost:8000/docs${NC}\n" uvicorn main:app --reload --host 0.0.0.0 --port 8000使脚本可执行:
chmod +x start.sh使用脚本启动:
📚 API 文档
FastAPI 自动生成交互式 API 文档:
Swagger UI
访问
http://localhost:8000/docs特点:
ReDoc
访问
http://localhost:8000/redoc特点:
🧪 测试清单
完成基础框架后,确保以下功能正常:
🎯 Vibe Coding 要点
在这个过程中,我们应用了以下 Vibe Coding 原则:
1. 清晰的需求描述
❌ "创建一个 FastAPI 应用" ✅ "创建一个 FastAPI 应用,包含 CORS 配置、健康检查接口和 API 文档"2. 小步迭代
步骤1: 创建基础应用 步骤2: 添加环境变量 步骤3: 创建路由模块 步骤4: 测试验证3. 及时验证
每完成一个步骤,立即测试:
# 创建应用后 curl http://localhost:8000/ # 添加路由后 curl -X POST http://localhost:8000/chat/ask -d '{"message": "test"}'4. 保持上下文
在与 AI 对话时,提供项目背景:
"我正在开发一个 Text-to-BI 系统,使用 FastAPI 作为后端框架..."本节小结
本节我们完成了 FastAPI 基础框架的搭建:
现在我们有了一个可运行的 FastAPI 基础框架,可以在此基础上添加更多功能。
思考与练习
思考题
allow_origins为什么不建议设置为["*"]?实践练习
扩展项目结构:
models/目录用于数据模型utils/目录用于工具函数tests/目录用于测试代码添加新路由:
/api/info接口环境配置优化:
中间件实践:
上一节:第 6 节:技术架构与设计思路
下一节:第 8 节:集成 CubeJS 数据模型