我提供了FastAPIReact个应用

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

@app.route('/session')
async def renderReactApp(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

通过这个React应用程序,React路由在客户端也可以正常工作

  • @app.route('/network')
  • @app.route('/gat')
  • @app.route('/session')

async def renderReactApp(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

但对我来说,这似乎很奇怪和错误,因为我需要在后端和前端添加每条路由.

我确信FastAPI中一定有类似Flask @flask_app.add_url_rule('/<path:path>', 'index', index)的东西,它将服务于所有任意路径

推荐答案

由于FastAPI基于Starlette,因此您可以在路由参数中使用他们所称的"转换器",在本例中使用类型path,它"返回路径的其余部分,包括任何额外的/个字符"

参考https://www.starlette.io/routing/#path-parameters.

如果你的react (或vue或…)应用程序正在使用基本路径,您可以执行以下操作,将/my-app/之后的任何内容分配给rest_of_path变量:

@app.get("/my-app/{rest_of_path:path}")
async def serve_my_app(request: Request, rest_of_path: str):
    print("rest_of_path: "+rest_of_path)
    return templates.TemplateResponse("index.html", {"request": request})

如果您没有使用像/my-app/这样的唯一基本路径(这似乎是您的用例),您仍然可以通过一个"全覆盖"路由来实现这一点,该路由应该遵循任何其他路由,以便它不会覆盖它们:

@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})

(事实上,为了捕捉/my-app//my-app请求之间的差异,您可能希望使用这个catch all)

Python-3.x相关问答推荐

无法使用Python slack 螺栓SDK读取在 slack 通道中收到的消息

Python GUI:tkinter应用程序作为Windows的实时桌面

将列表转换为 pandas 数据框,其中列表包含字典

我应该如何调整我的变量,以便如果有任何单词符合其中的条件,程序会将其附加到新列表中?

Pandas matplotlib:条形图占总数的百分比

多进程:两个进程,一起杀死

Pandas 按值和索引对 DF 进行排序

使用 pandas 数据帧映射到中转( node )点的跨容量请求

如何从脚本中提取 PDF 文档的标题以进行重命名?

Python - For 循环数百万行

Generic[T] 基类 - 如何从实例中获取 T 的类型?

如何从同一文件夹中的模块导入功能?

如何在元素列表中找到最大的数字,可能是非唯一的?

AttributeError:系列对象没有属性iterrows

PIL 在图像上绘制半透明方形覆盖

Python 3 - Zip 是 pandas 数据框中的迭代器

带有自定义标头的 urllib.urlretrieve

如何创建一个永远在其上运行滚动协程的事件循环?

Python 无法处理以 0 开头的数字字符串.为什么?

如何更改 tkinter 文本小部件中某些单词的 colored颜色 ?