一个最小的 fastapi 示例加载 index.html

A minimal fastapi example loading index.html

在我的项目文件夹中,我有一个基本的 index.html 文件加上静态文件(js,css)以及我的 main.py:

from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi import Request

app = FastAPI()

templates = Jinja2Templates(directory="/")
app.mount("/", StaticFiles(directory="/"))

@app.get("/")
def serve_home(request: Request):
    return templates.TemplateResponse("index.html", context= {"request": request}) 

如何让 fastapi 在这里工作?我只想在本地主机上提供我的 index.html 和静态文件。 没有 statictemplates 文件夹会不会有问题?

选项一:静态文件挂载

这比预期的要容易。只需要将包括index.html在内的所有静态文件放入项目目录下的static文件夹中,并挂载静态文件。

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles

app = FastAPI()

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

就是这样。我的 index.html 现在可以在 http://localhost:8000/static/index.html 下使用。

万一它应该可以在 http://localhost:8000/ 下访问而无需 /static 并且 .html 结尾需要更改两件事。首先,它需要安装在 / 而不是 /static 上,并且安装时必须将 HTML 标志设置为 true。所以只需使用这一行:

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

(感谢this answer

index.html 现在可以在 http://localhost:8000/

下使用

选项 2:仅投放 index.html

由于 fastapi 基于 starlette,一个简单的 FileResponse 就可以完成这项工作。

from starlette.responses import FileResponse 

@app.get("/")
async def read_index():
    return FileResponse('index.html')

找到 here.

最适合我的最简单的解决方案:

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles

api_app = FastAPI(title="api app")

@api_app.post("/set_influencers_to_follow")
async def set_influencers_to_follow(request):
    return {}

app = FastAPI(title="main app")

app.mount("/api", api_app)
app.mount("/", StaticFiles(directory="ui", html=True), name="ui")

如果项目结构如下:

├── main.py
├── ui
│   ├── index.html
│   ├── style.css
│   ├── script.js