如何使用 FastAPI 提供保存在 docker 卷中的静态文件?

How to serve static files saved in a docker volume with FastAPI?

我已经创建了两个卷,t21db 用于我的 SQLite 数据库,t21images 用于我的图像,在我的 FastAPI 应用程序中我使用 app.mount 将卷的位置挂载到检索图像,这是代码 -

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.mount("/app/images", StaticFiles(directory="."), name="static") # <--- here, is this directory correct?

app.include_router(webapp, prefix='/api/v1/webapp', tags=["WebApp"])
app.include_router(webapptype, prefix='/api/v1/webapptype', tags=["WebAppType"])

我有一个端点,它使用一个函数从卷中获取图像 URL,但这目前似乎不起作用,因为我收到了状态代码 404

def __get_url(self, image, request: Request):
    return request.url_for('static', path=f"app/images/{image}")

我就是这样 运行 我的容器和安装卷 -

docker run --mount source=t21db,target=/app/db --mount source=t21images,target=/app/images -p 3088:5000 t21

我之前使用 /app/images 路径检索要编码的图像,但后来更改为提供图像 URL 效率更高

如何在我的应用程序中获取正确的卷路径来提供静态文件?

希望对您有所帮助,

我在 docker 中没有安装目录的情况下使用的是

app.mount("/static", StaticFiles(directory="static"), name="static")
app.mount("/media", StaticFiles(directory="media"), name="media")

确保正确设置目录

并尝试

app.mount("/images", StaticFiles(directory="images"), name="images") 

我什至使用了 traefik 或 nginx 而没有安装我的 statics 或 ... 文件夹

好的,所以解决方案是将路径添加到 directory 作为 app.mount

中的初始路径参数

所以这有效 -

app.mount("/app/images", StaticFiles(directory="/apps/images"), name="static")