This repository has been archived on 2026-10-02. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
NeteaseUrl/web/main.py
T
snowy-yang f5d1e3c3a9 feat: 支持纯 FastAPI 模式(根路径服务前端)+ 修任务端点路径
- web/app.py:create_app(api_prefix=) 参数化前缀——'' 即根路径模式,
  87 条路由直接服务前端使用的路径,无需 Flask 兜底
- web/main.py:WEB_MODE=dual(默认,迁移期)/ fastapi(纯 FastAPI)切换
- 修真实路径缺陷:任务类端点漏了 /api 段(Flask 为 /api/topen 等,
  原写成 /topen),根路径模式下前端会 404。已改为 /api/topen、/api/queue、
  /api/batch_progress、/api/task/*;fe_error 同步修正
- 奇偶校验路径映射同步更新

验证:
- tests/test_root_mode.py 新增 66 项:前端调用的每条路径在纯 FastAPI 模式下
  均非 404;root 模式不再暴露 /api/v1
- 纯 FastAPI 模式真实启动(uvicorn, PORT=5002)实测:
  /health、/、/static 200,/song、/api/task/list 401(鉴权生效)
- 全套 pytest 135/135;ruff All checks passed;pyright 0 errors;奇偶 36/36
2026-09-26 10:25:05 +08:00

47 lines
1.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""FastAPI 服务入口(uvicorn)。
运行(生产/开发一致):
python web/main.py
迁移期(strangler):默认开启 Flask 兜底——未迁移的路由由遗留 Flask 应用处理,
已迁移的 /api/v1 路由走 FastAPI。全部迁移完成后把 FASTAPI_FLASK_FALLBACK 默认值
改为 0 即可完全脱离 Flask(届时删除 setdefault 行为)。
"""
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
HOST = os.environ.get('HOST', '0.0.0.0')
PORT = int(os.environ.get('PORT', '5000'))
# 运行模式(默认保持迁移期形态,切换为显式操作):
# WEB_MODE=dual(默认)已迁移路由挂 /api/v1 + Flask 兜底其余路由(前端仍走根路径→Flask)
# WEB_MODE=fastapi 已迁移路由直接挂根路径,完全由 FastAPI 服务(不再需要 Flask)
WEB_MODE = os.environ.get('WEB_MODE', 'dual').strip().lower()
if WEB_MODE == 'fastapi':
app = create_app(serve_flask_fallback=False, api_prefix='')
else:
app = create_app(serve_flask_fallback=True, api_prefix='/api/v1')
if __name__ == '__main__':
uvicorn.run(
app,
host=HOST,
port=PORT,
log_level=os.environ.get('LOG_LEVEL', 'info').lower(),
# 反向代理(Caddy 本机回环)下按 XFF 取真实 IP,与既有口径一致
proxy_headers=True,
forwarded_allow_ips='127.0.0.1',
server_header=False, # 不暴露服务器版本指纹
date_header=True,
)