TraceStudio-dev/docs/server/code_style.md
Boshuang Zhao 5790ec164f add web v2
2026-01-10 19:08:49 +08:00

4.5 KiB
Raw Permalink Blame History

TraceStudio — 服务器代码风格与工程约定

本文档为后端(server/)代码库的风格指南与工程约定,目的是保证多人协作时代码一致性、可维护性与安全性。遵循本指南可简化静态分析、代码审查和自动化测试。

适用范围

  • 路径: server/, server/app/, 以及与后端紧密相关的自定义节点目录 server/custom_nodes/
  • 语言: Python 3.11+

一、总体原则

  • 简洁明确: 优先清晰可读的实现,避免过度抽象。
  • 明确契约: 所有 HTTP 接口应使用 Pydantic 模型定义输入/输出契约。
  • 安全优先: 文件路径、上传、代码执行(自定义节点)必须进行严格校验与最小权限操作。

二、代码风格

  • 遵循 PEP8并在提交前运行 ruff(用于 lintblack(用于格式化)。
  • 类型注解: 函数与公有接口应使用类型注解;异步函数使用 async def 并返回具体类型或 -> Any
  • 命名约定:
    • 文件/模块: snake_case.py
    • 类: PascalCase
    • 变量/函数: snake_case
    • 常量: UPPER_SNAKE
  • 日志与调试: 使用 logging 模块,避免 print(仅在开发脚本或 CLI 初始化中短期使用)。

三、项目结构与职责

  • server/main.py: 应只负责应用初始化FastAPI app 创建、CORS、路由 include、startup/shutdown 事件注册)。
  • server/app/api/: 放置所有路由文件(按功能分组,例如 endpoints_upload.py, endpoints_graph.py, endpoints_custom_nodes.py)。每个路由文件应只包含路由及与路由相关的轻量逻辑,复杂逻辑放在 app/core/
  • server/app/core/: 核心服务、执行器、节点实现与工具函数。该目录应是无外部 HTTP 依赖的纯 Python 逻辑,便于单元测试。
  • cloud/custom_nodes/: 用户可编辑的自定义节点放置处。该目录需要单独的安全扫描与备份策略。

四、API 与模型约定

  • 使用 pydantic.BaseModel 定义请求体与响应模型。保持模型命名清晰(例如 NodeSchema, GraphExecuteRequest, FileInfo)。
  • 在 router 函数中对外只返回标准 JSON 可序列化类型;遇到复杂对象(如 Polars DataFrame应转换为带 __type 标记的序列化对象。

示例约定:

from pydantic import BaseModel

class FileInfo(BaseModel):
    name: str
    path: str
    type: str
    size: Optional[int]

@router.get('/files/info')
async def get_file_info(path: str) -> FileInfo:
    ...

五、异步与并发

  • 网络 I/O文件流、上传/下载、数据库调用)优先使用 async/await
  • CPU 密集型操作(大规模数据处理)应移到后台任务或使用专门进程/线程池(例如 concurrent.futures.ProcessPoolExecutor),避免阻塞事件循环。

六、安全策略

  • 所有外部路径输入必须被 sanitize_path(规范化)并通过 is_safe_path / NodeValidator.is_safe_filename 验证。
  • 自定义节点代码在保存或上传时应做静态分析(validate_node_code),并在加载前备份旧版本。
  • 严禁在未经批准的上下文中直接执行用户上传的 Python 代码,运行时应该有沙箱、权限限制或审计日志(当前实现为“可加载但需谨慎”)。

七、测试与 CI

  • 单元测试: 把纯逻辑放在 server/app/core/ 以利于测试,使用 pytest 编写测试(目录: server/tests/)。
  • 集成测试: 提供针对主要路由的集成测试,使用 httpx.AsyncClient 或直接调用 FastAPI 的 TestClient。
  • 建议在 CI 中运行命令:
pip install -r server/requirements.txt
ruff check server --fix
black server
pytest -q

八、依赖管理与运行

  • 使用 requirements.txt(已在 server/requirements.txt)或 pyproject.toml + poetry 管理依赖。
  • 推荐在 Conda 环境中使用 Python 3.11(项目 README 已包含样例启动脚本 start.ps1)。

九、日志与监控

  • 使用 logging 且在 main.py 中配置基本 logger分级输出到控制台生产建议使用文件/外部日志服务)。
  • 在关键操作(文件上传、节点加载、工作流执行)中加入审计日志(包含 user, filename, action, timestamp

十、文档与开发者体验

  • 所有公共函数与类应有 docstringAPI 路由中应包含简短注释(目的、参数、错误码)。
  • docs/ 下维护 API 文档(已生成 docs/server/api.md)和代码风格文档。

文件: server/main.py