From f093a8ac6d91114d184ce8fc218efa3b6fce5a6d Mon Sep 17 00:00:00 2001 From: Orion Date: Tue, 21 Jul 2026 17:02:24 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20=E5=90=AF=E7=94=A8=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E5=B9=B6=E5=85=BC=E5=AE=B9=E7=BB=9F=E4=B8=80=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E8=B5=84=E6=BA=90=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 FastAPI 应用启用 Gzip,并兼容 Vite 在 /theme-assets/ 基址下生成的 assets 子路径。 - 压缩超过 1KB 的静态资源和 API 响应,保留不可变缓存策略 - 同时兼容 /theme-assets/ 与 /theme-assets/assets/ - 保留 /assets 旧入口,避免影响历史主题 - 已通过 Python 编译检查 --- main.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 67fc1b1..be6c74a 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, HTMLResponse, PlainTextResponse +from starlette.middleware.gzip import GZipMiddleware from tortoise import Tortoise from tortoise.contrib.fastapi import register_tortoise @@ -120,6 +121,8 @@ async def migrate_password_to_hash(): app = FastAPI(lifespan=lifespan) +app.add_middleware(GZipMiddleware, minimum_size=1024, compresslevel=6) + @app.middleware("http") async def refresh_settings_middleware(request, call_next): await refresh_settings() @@ -151,8 +154,11 @@ app.include_router(admin_api) @app.get("/theme-assets/{asset_path:path}") @app.get("/assets/{asset_path:path}") async def theme_asset(asset_path: str): + # Vite with base=/theme-assets/ emits /theme-assets/assets/ while + # legacy themes use /theme-assets/. Keep both forms compatible. + normalized_asset_path = asset_path.removeprefix("assets/") theme_assets = (BASE_DIR / settings.themesSelect / "assets").resolve() - target = (theme_assets / asset_path).resolve() + target = (theme_assets / normalized_asset_path).resolve() try: target.relative_to(theme_assets) except ValueError: