TraceStudio-dev/docs/server/code_style.md

86 lines
4.5 KiB
Markdown
Raw Permalink Normal View History

2026-01-10 19:08:49 +08:00
# TraceStudio — 服务器代码风格与工程约定
本文档为后端(`server/`)代码库的风格指南与工程约定,目的是保证多人协作时代码一致性、可维护性与安全性。遵循本指南可简化静态分析、代码审查和自动化测试。
**适用范围**
- 路径: `server/`, `server/app/`, 以及与后端紧密相关的自定义节点目录 `server/custom_nodes/`
- 语言: Python 3.11+
**一、总体原则**
- 简洁明确: 优先清晰可读的实现,避免过度抽象。
- 明确契约: 所有 HTTP 接口应使用 Pydantic 模型定义输入/输出契约。
- 安全优先: 文件路径、上传、代码执行(自定义节点)必须进行严格校验与最小权限操作。
**二、代码风格**
- 遵循 PEP8并在提交前运行 `ruff`(用于 lint`black`(用于格式化)。
- 类型注解: 函数与公有接口应使用类型注解;异步函数使用 `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` 标记的序列化对象。
示例约定:
```py
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 中运行命令:
```bash
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](server/main.py#L1-L1)