列出 FastAPI 中静态文件夹中的文件

Mic*_*Hua 9 filesystems fastapi

我知道如何使用StaticFiles在 FastAPI 中提供静态文件,如何像 Apache Web 服务器中那样启用目录列表?

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles

app = FastAPI(...)

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

# GET http://localhost:8000/samples/path/to/file.jpg -> OK
# GET http://localhost:8000/samples -> not found error
Run Code Online (Sandbox Code Playgroud)

gma*_*gno 4

我不确定 FastAPI/Starlette 是否公开了开箱即用的功能。

但自己实现一些东西应该不会太难。这可能是一个起点:

import os
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

app = FastAPI()

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


templates = Jinja2Templates(directory="templates")


@app.get("/static", response_class=HTMLResponse)
def list_files(request: Request):

    files = os.listdir("./static")
    files_paths = sorted([f"{request.url._url}/{f}" for f in files])
    print(files_paths)
    return templates.TemplateResponse(
        "list_files.html", {"request": request, "files": files_paths}
    )

Run Code Online (Sandbox Code Playgroud)

列表文件.html

<html>
  <head>
    <title>Files</title>
  </head>
  <body>
    <h1>Files:</h1>
    <ul>
      {% for file in files %}
      <li><a href="{{file}}">{{file}}</a></li>
      {% endfor %}
    </ul>
  </body>
</html>

Run Code Online (Sandbox Code Playgroud)

当你点击时/static你会看到:

在此输入图像描述


补充笔记

请注意,这是一个 html 模板,应该位于@Michel Hua 在他的评论中相关提到的list_files.html目录中。templates/有关模板的更多信息,请查看模板文档