基于 Electron + FastAPI 的目标检测系统后端说明文档(二)
本文介绍了一个基于FastAPI构建的目标检测系统后端服务,主要包含以下内容:1)采用统一JSON格式的API接口规范,定义了状态码和文件大小限制;2)设计了模型信息存储的数据结构;3)配置了包含文件和控制台处理器的日志系统;4)实施了异步处理、流式响应和模型缓存等性能优化策略;5)考虑了文件验证、路径安全和CORS限制等安全性措施;6)提供了开发环境、生产环境和Docker三种部署方案;7)列出
1. 项目概述
本项目后端是一个基于 FastAPI 构建的高性能异步 API 服务,专为目标检测系统提供完整的后端支持。

4. API 接口规范
4.1 统一响应格式
所有接口遵循统一的 JSON 响应格式:
{
"code": 200,
"message": "成功",
"data": {}
}
4.2 错误响应格式
{
"detail": "错误信息描述"
}
常见 HTTP 状态码:
-
200: 成功 -
400: 请求参数错误 -
404: 资源不存在 -
500: 服务器内部错误 -
504: 请求超时
4.3 文件大小限制
-
图片文件: 最大 10MB
-
视频文件: 最大 500MB
-
模型文件: 最大 500MB
5. 数据库设计
5.1 模型信息存储 (models_info.json)
[
{
"filename": "20240321_123456_yolo.pt",
"name": "YOLO检测模型",
"dataset": "COCO",
"base_model": "YOLO",
"upload_time": "2024-03-21 12:34:56",
"description": "基于COCO数据集训练的YOLO目标检测模型",
"version": "1.0",
"accuracy": 85.5
}
]
6. 日志系统
6.1 日志配置
def setup_logging():
"""配置日志系统"""
log_filename = datetime.now().strftime("%Y.%m.%d.log")
log_filepath = LOGS_DIR / log_filename
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 文件处理器
file_handler = logging.FileHandler(log_filepath, encoding='utf-8')
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.INFO)
# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
console_handler.setLevel(logging.INFO)
# 配置根日志记录器
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
root_logger.addHandler(file_handler)
root_logger.addHandler(console_handler)
6.2 日志级别
-
INFO: 正常操作日志 -
WARNING: 警告信息 -
ERROR: 错误信息 -
CRITICAL: 严重错误
7. 性能优化策略
7.1 异步处理
所有 I/O 密集型操作使用 async/await:
@router.post("/upload/{filename}")
async def upload_image_with_filename(filename: str, file: UploadFile = File(...)):
content = await file.read() # 异步读取
# ...
7.2 流式响应
大文件下载使用流式响应:
return StreamingResponse(
buffer,
media_type='application/zip',
headers={'Content-Disposition': f'attachment; filename="{zip_filename}"'}
)
7.3 模型缓存
YOLO 模型采用全局单例模式,避免重复加载:
current_model = None
def get_current_model():
global current_model
if current_model is None:
current_model = YOLO("yolo11n.pt")
return current_model
8. 安全性考虑
8.1 文件验证
# 验证文件格式
ext = Path(file.filename).suffix.lower()
if ext not in ALLOWED_IMAGE_EXTENSIONS:
raise HTTPException(status_code=400, detail=f"不支持的图片格式: {ext}")
# 验证文件大小
if len(content) > MAX_IMAGE_SIZE:
raise HTTPException(status_code=400, detail=f"图片文件大小超过限制")
8.2 路径安全
# 使用 Path 对象防止路径遍历攻击 filepath = IMAGES_UPLOAD_DIR / filename if not filepath.exists(): raise HTTPException(status_code=404, detail="图片不存在")
8.3 CORS 限制
生产环境应限制 CORS 来源:
app.add_middleware( CORSMiddleware, allow_origins=["https://yourdomain.com"], # 限制来源 allow_credentials=True, allow_methods=["GET", "POST", "DELETE"], allow_headers=["*"], )
9. 部署指南
9.1 开发环境启动
# 安装依赖 cd backend pip install -r requirements.txt # 启动服务(开发模式,自动重载) python -m uvicorn app:app --host 0.0.0.0 --port 10077 --reload # 或直接运行 python app.py
9.2 生产环境部署
# 使用 Gunicorn + Uvicorn Workers gunicorn app:app \ --workers 4 \ --worker-class uvicorn.workers.UvicornWorker \ --bind 0.0.0.0:10077 \ --timeout 300
9.3 Docker 部署
FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 10077 CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "10077"]
10. 环境变量配置
10.1 必需环境变量
# 大语言模型 API 配置 LLM_API_KEY=your_api_key_here LLM_BASE_URL=https://api.siliconflow.cn/v1
10.2 可选环境变量
# 服务端口 PORT=10077 # 日志级别 LOG_LEVEL=INFO # 模型路径 MODEL_PATH=./models/yolo11n.pt
11. 常见问题(FAQ)
Q1: 如何切换 GPU/CPU 模式?
修改 images.py 中的模型加载代码:
# CPU 模式
current_model.to('cpu')
# GPU 模式
current_model.to('cuda')
Q2: 如何添加新的 API 接口?
-
在对应模块文件中添加路由函数
-
使用
@router.get/post/put/delete装饰器 -
确保在
app.py中已注册该路由器
Q3: 如何自定义日志格式?
修改 app.py 中的 setup_logging 函数:
formatter = logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )
12. 最佳实践总结
12.1 代码规范
-
使用类型提示(Type Hints)
-
所有异步函数使用
async def -
使用 Pydantic 模型进行数据验证
-
遵循 PEP 8 代码风格
12.2 错误处理
-
使用
HTTPException抛出标准 HTTP 错误 -
记录所有异常到日志
-
返回友好的错误信息
12.3 性能建议
-
使用异步 I/O 处理文件操作
-
大文件使用流式传输
-
合理设置超时时间
-
使用连接池管理数据库连接
联系方式
-
微信公众号:DetectionHub
更多推荐
所有评论(0)