如何在 FastAPI 后端提供 React 构建的前端?

Posted

技术标签:

【中文标题】如何在 FastAPI 后端提供 React 构建的前端?【英文标题】:How do I serve a React-built front-end on a FastAPI backend? 【发布时间】:2021-02-06 03:45:55 【问题描述】:

我尝试使用app.mount 将前端安装到/,但这会使我的所有/api 路由无效。我还尝试使用以下代码将/static 中的文件夹挂载到它们各自的路由并在/ 上提供index.html 文件:

@app.get("/")
def index():
    project_path = Path(__file__).parent.resolve()
    frontend_root = project_path / "client/build"
    return FileResponse(str(frontend_root) + '/index.html', media_type='text/html')

static_root = project_path / "client/build/static"
app.mount("/static", StaticFiles(directory=static_root), name="static")

这主要是可行的,但包含在 client/build 文件夹中的文件未安装,因此无法访问。我知道 Node.js 有一种方法可以通过 res.sendFile("index.html", root: </path/to/static/folder ); 的相对路径为前端页面提供服务。在 FastAPI 中是否有等效的函数来执行此操作?

【问题讨论】:

阅读this 代码,其中FastAPIReact 由单个服务器提供服务。要点是 - 你需要一个运行 React 的进程和一个运行 FastAPI 的进程和一个路由调用的代理服务器(本例中为 nginx)。 【参考方案1】:

clmno的解决方案是两台服务器+路由。 Jay Jay Cayabyab 正在寻找 API 上的端点,该端点为 webpacked SPA 提供服务,你在 npm run build 之后得到的那种。我一直在寻找完全相同的解决方案,因为这就是我对 Flask 所做的事情,并且我正在尝试用 FastAPI 替换 Flask。

在 FastAPI 的文档之后,多次提到它是基于 starlette 的。搜索在 starlette 上提供 SPA 服务时,我找到了 this reply 的问题。当然,这对我来说不是现成的,因为我错过了一些在建议的解决方案中未提及的导入。

这是我的代码,它正在运行:

from fastapi.staticfiles import StaticFiles

class SPAStaticFiles(StaticFiles):
async def get_response(self, path: str, scope):
    response = await super().get_response(path, scope)
    if response.status_code == 404:
        response = await super().get_response('.', scope)
    return response

app.mount('/my-spa/', SPAStaticFiles(directory='folder', html=True), name='whatever')

注意:我更改了端点(my-spa)、目录(文件夹)和应用程序名称(无论是什么)的名称,以强调这些不必完全相同。

在这种情况下,您将构建的 SPA 放在 folder 文件夹中。为此,在 SPA 项目文件夹中,运行 npm run buildyarn run build,并获得一个名为 dist 的文件夹。将 dist 中的所有文件和文件夹复制到此 folder 文件夹中。

完成此操作后,运行您的 FastAPI 应用程序,然后转到 http://localhost:5000/my-spa/。为了绝对清楚起见,我使用这个特定 URL 的原因是我的应用程序有一个这样的 main:

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=5000)

所以它从端口 5000 开始。您的情况可能会有所不同。

当这些回复中缺少导入时,我讨厌它,因为有时看起来回复甚至从未运行过。当我输入这个时,我的正在另一个屏幕上运行,所以这不会浪费你的时间。但是,假设您已经在做一些琐碎的事情,我自己可能会错过一些导入

from fastapi import FastAPI

等等。如果您尝试此操作并发现缺少任何内容,请在此处告诉我。

【讨论】:

我发现你的回答很有帮助,我还要说我最终只是按照这里的建议去做。 ***.com/a/68488252/3538107。感谢您的帮助! 这非常深入,但不幸的是我得到了`TypeError:'NoneType' object is not callable`我相信if response.status_code == 404:,但实际上只适用于404s。很奇怪,正在研究它。 嗨,迦勒。正如我所说,我发布这个答案首先是为了帮助。请在 LinkedIn 上联系我(我的 *** 个人资料上的链接),让我们从那里开始。我们可以有一个缩放或什么的。不,这不是付费服务!

以上是关于如何在 FastAPI 后端提供 React 构建的前端?的主要内容,如果未能解决你的问题,请参考以下文章

如何在调用更新后端状态的函数时从 python (fastapi) 发送服务器端事件

vueadmin-fastapi

FastAPI 1:安装FastAPI

跨站点 cookie 的问题:如何将 cookie 从后端设置到前端

如何使用 React 读取图像标题

Vue 3 和 cookie