From 4953b6a68dd4cc8e0700d5db95d5d72355fcc60e Mon Sep 17 00:00:00 2001 From: Orion Date: Fri, 5 Jun 2026 17:37:56 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E5=88=87=E6=8D=A2=E8=B5=84=E6=BA=90=E7=99=BD=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/main.py b/main.py index 656ae12..c8698aa 100644 --- a/main.py +++ b/main.py @@ -8,8 +8,7 @@ from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import HTMLResponse -from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse, HTMLResponse, PlainTextResponse from tortoise import Tortoise from tortoise.contrib.fastapi import register_tortoise @@ -75,12 +74,6 @@ async def lifespan(app: FastAPI): # 加载配置(多进程下串行化启动写操作) async with db_startup_lock(): await load_config() - app.mount( - "/assets", - StaticFiles(directory=f"./{settings.themesSelect}/assets"), - name="assets", - ) - # 启动后台任务 task = asyncio.create_task(delete_expire_files()) chunk_cleanup_task = asyncio.create_task(clean_incomplete_uploads()) @@ -154,6 +147,22 @@ app.include_router(presign_api, prefix="/api") app.include_router(admin_api) +@app.get("/assets/{asset_path:path}") +async def theme_asset(asset_path: str): + theme_assets = (BASE_DIR / settings.themesSelect / "assets").resolve() + target = (theme_assets / asset_path).resolve() + try: + target.relative_to(theme_assets) + except ValueError: + return PlainTextResponse("Not found", status_code=404) + if not target.is_file(): + return PlainTextResponse("Not found", status_code=404) + return FileResponse( + target, + headers={"Cache-Control": "public, max-age=31536000, immutable"}, + ) + + @app.exception_handler(404) @app.get("/") async def index(request=None, exc=None):