feat: 设置页调 batch_size + 删除任务 + /docs 去认证 + 离线模式
设置页(/settings):
- 新增 Setting DB 模型(键值存储,持久化运行时覆盖)
- config.py 加 _apply_overrides:get_settings() 合并 DB 覆盖值
(_applying_overrides 标志防递归:DB 初始化回调 get_settings 时不重入)
- save_setting() 写 DB + 清 lru_cache,后续任务读到新值
- settings_router.py: GET/PUT /api/settings
- settings_html.py: 设置页表单(batch_size/beam_size/sort_by_length)
+ 设备只读信息 + 保存后 reload 确认
- 验证:改 asr_batch_size=16 beam_size=1 -> 任务 ASR 日志确认生效
- 验证:重启容器后设置从 DB 恢复(持久化)
删除任务:
- task_router.py: DELETE /api/tasks/{id},仅 done/failed 可删
删字幕/音频/视频产物 + UploadSession + Task DB 记录
- home_html.py + history_html.py: done/failed 任务显示删除按钮
+ confirm 确认 + 调用 DELETE API + 刷新列表
- 验证:删除 task 15 成功,删除进行中 task 返回 409
/docs 去认证:
- 移除 require_docs_auth 依赖,/docs /redoc /openapi.json 直接公开
离线模式:
- Dockerfile dev/final 加 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1
(模型已缓存在 ./models volume,无需联网验证)
- 验证:离线模式完整跑通 ASR+翻译(task 15 done)
This commit is contained in:
19
app/main.py
19
app/main.py
@@ -19,21 +19,21 @@ import logging
|
||||
import threading
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from fastapi import Depends, FastAPI
|
||||
from fastapi import FastAPI
|
||||
from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
|
||||
from fastapi.responses import HTMLResponse, JSONResponse
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from .config import get_settings
|
||||
from .controllers import log_router, task_router, upload_router
|
||||
from .controllers import log_router, settings_router, task_router, upload_router
|
||||
from .database import get_db, init_db_schema
|
||||
from .security import require_docs_auth
|
||||
from .services.cache_cleaner import purge_expired_cache, run_forever as run_cache_cleaner
|
||||
from .services.log_buffer import init_log_buffer
|
||||
from .services.reaper import reap_stale_sessions
|
||||
from .views.history_html import render as render_history_html
|
||||
from .views.home_html import render as render_home_html
|
||||
from .views.logs_html import render as render_logs_html
|
||||
from .views.settings_html import render as render_settings_html
|
||||
|
||||
# 日志分层:
|
||||
# - audio2text logger 始终设 DEBUG,确保所有记录(含子步骤)都能产生。
|
||||
@@ -126,20 +126,21 @@ def create_app() -> FastAPI:
|
||||
app.include_router(upload_router)
|
||||
app.include_router(task_router)
|
||||
app.include_router(log_router)
|
||||
app.include_router(settings_router)
|
||||
|
||||
# 受 Basic Auth 保护的文档接口
|
||||
# 文档接口(无认证,直接公开)
|
||||
@app.get("/openapi.json")
|
||||
def protected_openapi(_: str = Depends(require_docs_auth)) -> JSONResponse:
|
||||
def openapi_endpoint() -> JSONResponse:
|
||||
return JSONResponse(app.openapi())
|
||||
|
||||
@app.get("/docs")
|
||||
def protected_docs(_: str = Depends(require_docs_auth)):
|
||||
def docs_endpoint():
|
||||
return get_swagger_ui_html(
|
||||
openapi_url="/openapi.json", title="audio2text docs", swagger_favicon_url=""
|
||||
)
|
||||
|
||||
@app.get("/redoc")
|
||||
def protected_redoc(_: str = Depends(require_docs_auth)):
|
||||
def redoc_endpoint():
|
||||
return get_redoc_html(
|
||||
openapi_url="/openapi.json", title="audio2text docs", redoc_favicon_url=""
|
||||
)
|
||||
@@ -187,6 +188,10 @@ def create_app() -> FastAPI:
|
||||
def logs_page() -> HTMLResponse:
|
||||
return HTMLResponse(render_logs_html())
|
||||
|
||||
@app.get("/settings", response_class=HTMLResponse)
|
||||
def settings_page() -> HTMLResponse:
|
||||
return HTMLResponse(render_settings_html())
|
||||
|
||||
return app
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user