如何将后端和前端放在一起 - 从 fastapi 后端端点返回 React 前端

2024-03-21

首先,我只想说这是我的第一个 Web 应用程序项目。在过去的几天里,我一直在努力寻找如何将前端和后端放在一起的答案。我有很多问题,但我想回答的主要问题是如何从后端端点返回我的前端“最终产品”。

我的理解是这样的(如有错误请指正):

  • 前端代码由客户端(浏览器)运行。
  • 当客户端与网页交互时,前端根据需要对后端进行 API 调用以检索/修改数据。
  • 后端和前端通常是分开开发的,并且could托管在单独的服务器上。
  • 但是,可以(并且可能更简单)将其托管在单个域/服务器上。我希望这样做,以避免 CORS 带来的一系列问题。

那么接下来的问题就来了:

当我想测试我的前端并看看它进展如何时,我只需运行npm run start。然后我转到给定的网址(通常http://localhost:8080/)并且我可以访问我开发的前端。当我想部署它时,我运行npm run build,这给了我一个dist文件夹(捆绑在一起并缩小)。

如果我想在本地运行和测试我的后端,就像我正在使用的那样FastAPI,我只是跑uvicorn main:app --reload.

如何将两者放在一起?更具体地说,在我的后端代码中,如何返回前端工作的结果(即dist文件夹?)。我尝试过以下方法(简化):

@app.get("/", response_class=HTMLResponse)
def root():
    return open("../frontend/dist/index.html", "r").read()

但是,当然,这只给了我静态 html,没有 React 组件。

我意识到这篇文章可能包含错误的假设和糟糕的做法(在这种情况下,我很抱歉!并且我将不胜感激任何更正/建议。)但是,如果可以回答以下问题,我将不胜感激。我提出的这些问题有望帮助我在计算机上本地测试整个 Web 应用程序。

  1. 我如何返回我的前端工作的产品GET在域根端点请求?
  2. 如果我的网络应用程序有页面 A、页面 B 和页面 C,每个页面都有 urlwww.example.com/A, www.example.com/B, and www.example.com/C我必须创建三个独立的 React 前端项目吗?即相当于拥有三个dist文件夹?处理这个问题的标准方法是什么?

这些都是好问题,而且这当然是可能的。我会告诉你我做了什么,但警告可能有更好的方法......

我使用 Vue 而不是 React,但它的构建过程还会将静态 html、js 和 css 发送到dist/目录,因此过程应该大致相同。

首先你可以复制dist/index.html将您提到的文件写入 FastAPItemplates/目录。您将使用 FastAPI 路由将该文件作为模板提供。

然后将你的js和css复制到static/目录并确保 FastAPI 了解静态和模板。

from fastapi import FastAPI, Request
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("/")
async def serve_spa(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

您可能需要在 React 中设置一些内容,以便您的构建知道 js 和 css 将位于名为的目录中static。对于 Vue 来说,有assetsDir选项内vue.config.js

对于您关于处理不同路径的问题,例如example.com/a and example.com/b,这取决于您想要如何处理这些请求。您是否希望您的单个反应应用程序能够处理所有这些路线?

如果是这种情况,您可能还想查看:如何在FastAPI中捕获一条路径上的任意路径? https://stackoverflow.com/questions/63069190/how-to-capture-arbitrary-paths-at-one-route-in-fastapi/64147450

一种选择是复制serve_spa()上面的路线并处理您的路线,例如/a, /b, etc.

或者使用包罗万象的路线:

@app.route("/{full_path:path}")
async def catch_all(request: Request, full_path: str):
    print("full_path: "+full_path)
    return templates.TemplateResponse("index.html", {"request": request})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将后端和前端放在一起 - 从 fastapi 后端端点返回 React 前端 的相关文章

  • 将 Firebase FCM 添加到 ReactJS 应用程序

    我正在尝试向我的 ReactJS 应用程序中的用户发送推送通知 我已添加 firebase 请求用户通知权限 这正在发挥作用 但现在我想注册设备令牌 但这给了我错误 消息传递 我们无法注册默认的 Service Worker 无法注册 Se
  • 使用 ref 触发反应 dropzone 不起作用

    我正在实现这个库 https github com felixrieseberg React Dropzone Component https github com felixrieseberg React Dropzone Compone
  • 从旧的外部 Javascript 更改 React 组件的状态?

    如何从旧的 jQuery soup 中更改 React 组件的状态 代码 我有一个这样的组件 var AComponent React createClass getInitialState function return ids rend
  • 使用 mongoose 通过 React 应用程序将图像上传到 mongodb 数据库

    我正在为找到的对象创建一个反应应用程序 我想允许用户上传这些对象的照片 我尝试使用 axios 通过 post 请求将图像发送到猫鼬服务器 但它不起作用 这就是我如何将图像存储在带有预览的 React 组件中 handleImage eve
  • 使 Material UI Grid 项目的子项拉伸以适合父容器的剩余高度

    1 现状 我有一个包含 4 个网格项的 Material UI 网格容器 每个 Grid 项中都有一个 Typography 组件 其中包含标题和包含一些内容的 Card 如下所示 2 期望的外观 我希望卡片填充网格项目的剩余高度并且不超过
  • 如何使用Create React App安装React

    嗨 我对反应真的很陌生 我不知道如何实际安装它 也不知道我需要做什么才能在其中编写代码 我下载了node js并且安装了v12 18 3以及NPM 6 14 6 但是每次我尝试在许多网站上提到的create react app安装方法中输入
  • 可下载文件 - 盖茨比

    由于某种原因 尝试下载文件时失败 我尝试了几种不同的方法 但都失败了 我读过一些关于 pdf word 文件在盖茨比中被 禁止 的内容 默认 a href route to file a 好像不行 显示下载失败 任何帮助表示赞赏 See 将
  • 如何在 React 中测试表单提交?

    我有以下 React 组件 export default class SignUpForm extends React Component doSignupForm event Some API call render return div
  • Redux-saga 从操作中获取数据返回patternOrChannel 未定义

    我需要将动态数据从屏幕发送到操作 减速器 并使用该数据从 API 获取数据 但是当我在我的rootSaga我会收到这样的错误 在检查 take patternOrChannel 时未捕获 patternOrChannel 未定义未捕获在 r
  • useLocation 挂钩 - 确定过去的位置

    根据 React Router 5 1文档 https v5 reactrouter com web api location应该可以看到 应用程序现在在哪里 你想让它去哪里 甚至它曾经在哪里 在我的应用程序中 我需要查看 它在哪里 我访问
  • HTMLImageElement 作为 React Child 无效

    我正在尝试异步加载图像 并且仅在加载图像后才将其显示在 React 应用程序中 componentDidMount const img new Image img onload gt this setState originalImage
  • iOS 11 浏览器图像错误

    在 iOS 11 中滚动页面时出现以下错误 在 Firefox Safari 和 Chrome 中 在 Android 设备中 不会发生该错误 这些是背景图像 我不知道这是否是导致错误的原因 图 2 显示了图像在 Android 中的用途和
  • 在vscode中使用reactjs报错

    在 Visual Studio 代码中使用 jsx 语法 Visual Studio代码报错 请帮我 谢谢 符号 例如 而不是这样做 return lt button className square gt TODO lt button g
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • React Native 反应导航 SafeArea 问题

    我更新了我的android项目 react navigation was 3 x 搬去5 x 决定实施必要的更改 但它不想工作 从反应导航页面复制了示例 但仍然显示相同的错误 有人知道问题出在哪里吗 当我用谷歌搜索一半的互联网时找不到解决方
  • 如何在 React js 上使用历史记录重定向到另一个页面?

    我在前端使用 Reactjs 并在后端使用 Laravel 开发了一个注册页面 我希望当我单击注册按钮时 它将被重定向到我的登录页面 我的注册组件是 handleSubmit event gt event preventDefault co
  • JSX 支持哪些 ES6 功能?

    我在用着与 JSX 进行反应 with 反应工具 https www npmjs com package react tools将 JSX 代码编译为 JavaScript JSX 支持哪些 ES6 功能harmony选项已启用 感谢康加克
  • 如何在react-router-dom@v6中使用私有路由

    我想要将私有路由与react router dom v6一起使用 当我尝试应用身份验证条件时 在 App js 中
  • 带有 'as' 属性的通用 React TypeScript 组件(能够渲染任何有效的 dom 节点)

    我在下面的示例中按预期工作 我的问题是 无论如何我可以重写它 这样我就不必传递通用的T和as支柱 理想情况下我想通过asprop 并让组件的 prop 接口使用它 这在 TypeScript 中可能吗 export type Props l

随机推荐

  • MPI 中的相同发送和接收缓冲区

    在我的代码中 每个进程都作用于数组的特定部分 我希望每个进程将其处理的部分发送到其他进程 并从其他进程接收其他部分 为此我使用了MPI Allgatherv但我保持发送和接收缓冲区相同 MPI Allgatherv vel 0 localS
  • 如何将自定义的 Firefox 配置文件与 PHPUnit 的 Webdriver 框架结合使用?

    我知道使用 selenium RC 我曾经传递一个命令行操作符 firefoxProfileTemplate 这样就可以了 现在使用 Selenium2 Webdriver 这似乎不再起作用了 由于我正在使用 PHPUnit 进行其他测试
  • AWS Step Functions 是否登录 CloudWatch

    我想知道 AWS 步骤函数执行的输出是否记录在 CloudWatch 日志组中 我是not讨论由 step 函数调用的 lambda 函数的输出 我对状态机本身的输出感兴趣 我问这个问题是因为我们通常将所有日志集中在 loggly 中 以便
  • 是否可以将代码隐藏分成多个部分文件?

    我有一个带有 aspx cs 代码隐藏的 aspx Web 表单 隐藏的代码有近 2000 行长 而且已经到了轻松导航的唯一方法就是在各部分之间放置大量空格 缩小以便我可以看到代码的物理外观 并且然后放大我要编辑的地方 换句话说 这是一个很
  • 使用 Qt Designer 调整 Qt 拆分器布局大小行为

    我在 Qt 中通过拖放制作的视图中存在尺寸问题 让我从一张图片开始来帮助我解释 这是我的表单的主窗口 发生的情况是 我们有 4 个选项卡小部件 左侧选项卡小部件有一个到 2 个中间小部件的水平分割器 2 个中间小部件有一个垂直分离器 左侧和
  • 如何检测请求是否被中止?

    我正在提出请求 然后立即中止 var x get url function d e xhr alert d x abort 问题是它执行success函数并返回空数据 这里的例子 http jsfiddle net e5NBT 有没有 jQ
  • 将 ASM 转换为 C(不是逆向工程)

    我用谷歌搜索 发现数量惊人的轻率回复 基本上都是在嘲笑提出这样问题的提问者 Microchip 免费提供一些源代码 我不想将其发布在这里 以防万一 基本上 谷歌 AN937 单击第一个链接 其中有一个 源代码 链接及其压缩文件 它在 ASM
  • 使 Swift 并发中的任务串行运行

    我有一个基于文档的应用程序 它使用结构作为其主要数据 模型 由于模型是 的子类 的属性NSDocument需要从主线程访问它 到目前为止一切都很好 但对数据的某些操作可能需要相当长的时间 我想为用户提供一个进度条 这就是问题开始的地方 特别
  • 使用 Flask 蓝图,如果指定了子域,如何修复 url_for 的损坏?

    在烧瓶蓝图中 我有 frontend Blueprint frontend name 我的索引函数的路径是 frontend route def index code 这工作正常 但是 我试图向路由添加一个子域 如下所示 frontend
  • 合并两个列表C++

    我想合并两个列表 以便合并队列中仅存在一个公共元素条目 std list
  • 检测移动邮件客户端的标准方法?

    这个问题类似于 基于 http 请求在 Web 应用程序中检测移动浏览器的标准方法 https stackoverflow com questions 142273 standard way to detect mobile browser
  • HTTP_USER_AGENT Java/1.6.0_17 生产网站上的奇怪异常

    今天 我们的生产网站上收到了一些奇怪的异常情况 它们都有以下 HTTP USER AGENT 字符串 Java 1 6 0 17 我查了一下UserAgentString com http www useragentstring com i
  • jQuery 数据表过滤具有特定类的行

    我正在开发一个 jQuery Datatable 项目 我需要根据特定的行类过滤数据 我根据条件在创建行时向行添加类 我试图找出一种方法 让我的用户单击一个按钮 该按钮将应用一个仅显示包含特定类的行的过滤器 我尝试了几种不同的解决方案 但似
  • 如何在 Hadoop Hive 中获取给定时间戳的一周第一天的日期?

    除了编写自定义 UDF 来支持此问题之外 是否还有任何已知的方法可以实现此目的 我目前使用的是 Hive 0 13 从 Hive 1 2 开始 你还可以这样做 select next day date sub 2019 01 01 7 MO
  • Jupyter Notebook:对文件的访问被拒绝

    我正在尝试在 Ubuntu 21 10 上运行 Jupyter 笔记本 我已经安装了 python jupyter Notebook 以及所有各种先决条件 我添加了export PATH PATH local bin to my bashr
  • 测试:如何在两个连续的 Promise/run.laters 之间断言?如何跳过测试中的“run.later”等待?

    这是一个简单的组件 App FooBarComponent Ember Component extend tagName button status Ready revertStatusPeriodMs 2000 click functio
  • GnuPlot 中带零的对数 y

    我的目标是在对数刻度上显示 0 值 略低于 1 我设法绘制了自己的简单直方图 with boxes 具有对数 Y 刻度 我的 Y 值是非负整数 最大为 25000 我无法区分 0 和 1 值 因为 Y 刻度从 1 开始 这在数学上是正确的
  • 如何使 Windows DNS 和 WINS 设置保留在 Azure VM 中?

    我在 Azure VM 中设置了一个域控制器 并且其他几个服务器也设置为 VM 当我设置服务器虚拟机时 我将 DNS 和 WINS 配置为指向 DC 的 IP 地址并将它们加入域 但是 这些设置在关闭 虚拟机被释放 后将无法保留 当虚拟机重
  • sched_setscheduler是针对所有线程还是主线程?

    我有以下来源 喜欢将 SCHED RR 优先级设置为 90 int main int argc char argv const char sched policy SCHED OTHER SCHED FIFO SCHED RR SCHED
  • 如何将后端和前端放在一起 - 从 fastapi 后端端点返回 React 前端

    首先 我只想说这是我的第一个 Web 应用程序项目 在过去的几天里 我一直在努力寻找如何将前端和后端放在一起的答案 我有很多问题 但我想回答的主要问题是如何从后端端点返回我的前端 最终产品 我的理解是这样的 如有错误请指正 前端代码由客户端