FastAPI 子应用#
如果你需要有两个独立的 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 处理。