snowy-yang
|
18c77296c2
|
feat(routes): 迁移首页/静态资源 + /auth/me 认证状态
- web/routers/index.py:GET / 首页,用 Jinja2 以 Flask 同口径渲染
(keep_trailing_newline=False)——输出与 Flask render_template 逐字节一致
- web/app.py:挂载 /static 静态资源(site_auth.js 等,与 Flask 同目录)
- web/routers/auth_status.py:/api/v1/auth/me 认证状态
· user/duration_text/announcement/smtp_configured/register_credits 逐字段对齐
- core/repo.py:补 get_announcement / get_smtp_config / smtp_configured 异步读
契约奇偶校验:28 项全 OK(新增 index 逐字节、auth:me);
验证:pytest 51/51;ruff All checks passed;pyright 0 errors;
uvicorn 实跑 / 与 /static 与 /api/v1/* 均 200。
|
2026-09-26 09:51:32 +08:00 |
|
snowy-yang
|
2c55b55e03
|
feat(routes): 迁移查询类路由到 FastAPI + 会话互通 + 统一错误/限流
会话互通(迁移关键):
- core/session.py:itsdangerous 兼容的签名 Cookie 编解码(同密钥/同 salt/同
时间戳编码),Flask 与 FastAPI 双向可读——实测 F->core 与 core->F 双向解出一致,
篡改/错密钥返回 None
FastAPI 基础设施:
- web/deps.py 会话→当前用户(封禁/顶号校验,口径同 auth_system.current_user)
- web/errors.py AppError + 全局异常处理,404/405/400 统一为本站包体
- web/ratelimit.py 复用 core.state 同一批限流桶(跨栈共享,避免绕框架绕过限流)
- core/repo.py 补 get_user_by_id(异步)
迁移路由(/api/v1/*,与 Flask 同端点逐字段对齐):
- toplist / artist_songs / comments / search,走 music_api 异步方法
- search 的服务器昵称遮蔽改为 FastAPI 侧异步实现(不再依赖 main)
契约奇偶校验:扩展至 7 项(含登录会话互通 + 未登录 401),全 OK;
CDN 分片主机差异归一化(上游易变值,非契约漂移)。
验证:pytest 33/33;ruff All checks passed;pyright 0 errors;
uvicorn 实跑未登录 401 包体与 Flask 一致。
|
2026-09-26 01:09:01 +08:00 |
|
snowy-yang
|
0f2e72db44
|
feat(db-async): 站点数据异步读写仓储 + FastAPI 生命周期
- core/repo.py:经由 core.db(aiosqlite) 读写 auth_system 的**同一份** site.db
(settings/announcements/users 只读/ledger 只读),字段口径对齐 auth_system;
读并发、写串行、WAL 读写同时进行
- web/routers/site.py:/api/v1/site/announcements、/api/v1/site/stats(异步多表并发读)
- web/app.py:lifespan 关闭时释放 aiohttp 连接池(含按 loop 隔离的 session)
写路径说明:迁移期写操作仍归 auth_system 的 _DB_LOCK 事务口径,避免两套写
路径互相踩踏;本层先只做读。
验证:pytest 22/22(新增 6 项含「异步读 + 同步写者并发 WAL」);
/api/v1/site/* 实测读到共享库(3 用户/1 管理员);ruff/pyright 干净。
|
2026-09-26 00:34:11 +08:00 |
|