FastAPI 子应用#

参考:sub-applications

如果你需要有两个独立的 FastAPI 应用程序,它们有自己独立的 OpenAPI 和自己的文档 UI,你可以分别拥有主应用程序和“挂载”的一个或多个子应用程序。

挂载 FastAPI 应用程序#

“挂载”意味着在特定路径中添加完全“独立”的应用程序,然后处理该路径下的所有内容,并在该子应用程序中声明路径操作。

顶层 FastAPI 应用程序#

首先,创建主要的顶层 FastAPI 应用程序及其路径操作:

from fastapi import FastAPI

app = FastAPI()


@app.get("/app")
def read_main():
    return {"message": "Hello World from main app"}

子应用#

然后,创建子应用程序及其路径操作。

这里的子应用程序只是另一个标准的 FastAPI 应用程序,但它将被“挂载”:

subapi = FastAPI()


@subapi.get("/sub")
def read_sub():
    return {"message": "Hello World from sub API"}

挂载子应用程序#

在顶层应用程序 app 中,挂载子应用程序 subapi

在这种情况下,它将被挂载在 /subapi 路径下:

app.mount("/subapi", subapi)

挂载其他 WSGI 组件#

可以使用 WSGIMiddleware 来包装你的 WSGI 应用,如:Flask,Django 等。

使用中间件包装 WSGI 应用(例如 Flask),之后将其挂载到某一个路径下:

from fastapi import FastAPI
from fastapi.middleware.wsgi import WSGIMiddleware
from flask import Flask, escape, request

flask_app = Flask(__name__)


@flask_app.route("/")
def flask_main():
    name = request.args.get("name", "World")
    return f"Hello, {escape(name)} from Flask!"


app = FastAPI()


@app.get("/v2")
def read_main():
    return {"message": "Hello World"}


app.mount("/v1", WSGIMiddleware(flask_app))
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
Cell In[4], line 3
      1 from fastapi import FastAPI
      2 from fastapi.middleware.wsgi import WSGIMiddleware
----> 3 from flask import Flask, escape, request
      5 flask_app = Flask(__name__)
      8 @flask_app.route("/")
      9 def flask_main():

ImportError: cannot import name 'escape' from 'flask' (/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/flask/__init__.py)

备注

现在,所有定义在 /v1/ 路径下的请求将会被 Flask 应用处理。其余的请求则会被 FastAPI 处理。