Archived
异步基础层(core/):
- db.py aiosqlite + WAL:读路径无锁并发、写路径 asyncio.Lock 串行,
busy_timeout 自旋——实现「读写同时进行」(旧实现用 RLock 全读串行)
- http_client.py aiohttp 连接池 + 有界重试(5xx 重试 / 4xx 不重试)+
响应体上限 + 流式接口;按事件循环隔离 session(支持迁移期双 loop)
工具链:
- pyproject.toml ruff(E/F/W/I/B/UP/C4/ASYNC/S/RUF) + pyright(basic) + pytest(asyncio auto)
- requirements-fastapi.txt FastAPI/aiohttp/aiosqlite/aiofiles 等目标栈
- requirements-dev.txt 开发依赖(pytest/ruff/pyright)
清理:删除无用脚本 _csscheck.py 与产物标记 _css_ok.txt/_pkg_ok.txt,同步 .gitignore
验证:pytest 10/10(含「写 200 条同时 4 读协程零异常」并发用例);
ruff All checks passed;pyright 0 errors。
24 lines
833 B
Python
24 lines
833 B
Python
# -*- coding: utf-8 -*-
|
|
"""FastAPI 服务入口(uvicorn)。
|
|
|
|
开发期启动: .venv/Scripts/python.exe web/main.py
|
|
生产切换前需先将状态/任务模型与既有 Flask 进程统一(见迁移计划阶段 C)。
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
import uvicorn
|
|
|
|
# 直接以 `python web/main.py` 运行时,sys.path[0] 是 web/ 而非项目根——
|
|
# 补上项目根,保证 `import core` / `import music_api` / `import web.app` 可用。
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from web.app import create_app
|
|
|
|
# 生产可在联调期临时打开 Flask 兜底(未迁移路由回落到遗留应用)
|
|
app = create_app(serve_flask_fallback=os.environ.get('FASTAPI_FLASK_FALLBACK') == '1')
|
|
|
|
if __name__ == '__main__':
|
|
uvicorn.run(app, host='0.0.0.0', port=5000, log_level='info')
|