三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档:https://fastapi.tiangolo.com/zh/advanced/wsgi/

包含 WSGI - Flask,Django,其它

您可以挂载多个 WSGI 应用,正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。

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

使用 WSGIMiddleware

您需要导入 WSGIMiddleware。

然后使用该中间件包装 WSGI 应用(例如 Flask)。

之后将其挂载到某一个路径下。

复制代码

from fastapi import FastAPI from fastapi.middleware.wsgi import WSGIMiddleware from flask import Flask, request from markupsafe import escape 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))

检查

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

其余的请求则会被 FastAPI 处理。

如果您使用 Uvicorn 运行应用实例并且访问 http://localhost:8000/v1/,您将会看到由 Flask 返回的响应:

复制代码
Hello, World from Flask! 

并且如果您访问 http://localhost:8000/v2,您将会看到由 FastAPI 返回的响应:

复制代码
{ "message": "Hello World" } 

实践

使用中间件来挂载pyramid web应用

示例1

源代码

源文件存盘为fastapipyramid.py文件

复制代码
from fastapi import FastAPI
from fastapi.middleware.wsgi import WSGIMiddleware
from pyramid.config import Configurator
from pyramid.response import Response


def pyramid_app(environ, start_response):
    config = Configurator()
    def hello_world(request):
        return Response('Hello from Pyramid!')
    config.add_route('hello', '/')
    config.add_view(hello_world, route_name='hello')
    app = config.make_wsgi_app()
    return app(environ, start_response)


app = FastAPI()
app.mount("/pyramid", WSGIMiddleware(pyramid_app))


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


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

启动服务

python 复制代码
uvicorn fastapipyramid:app --reload

测试

python 复制代码
curl 127.0.0.1:8000
{"message":"Hello from FastAPI"}
python 复制代码
curl 127.0.0.1:8000/pyramid/
Hello from Pyramid!

示例2

源代码

存为文件pyramid_fastapi.py

python 复制代码
from fastapi import FastAPI, Request
from fastapi.middleware.wsgi import WSGIMiddleware
from pyramid_app import create_app  # 导入 Pyramid 应用

# 创建 FastAPI 应用
app = FastAPI()

# 创建 Pyramid WSGI 应用
pyramid_app = create_app()

# 使用 WSGIMiddleware 将 Pyramid 应用包装到 FastAPI 中
app.mount("/pyramid", WSGIMiddleware(pyramid_app))

# 你也可以在 FastAPI 中定义其他路由
@app.get("/fastapi")
def read_root():
    return {"message": "Hello from FastAPI!"}

启动服务:

python 复制代码
uvicorn pyramid_fastapi:app --reload

测试

python 复制代码
curl 127.0.0.1:8000/fastapi
{"message":"Hello from FastAPI!"}
python 复制代码
curl 127.0.0.1:8000/pyramid/
Hello from Pyramid!

调试

启动pyramid报错

from backports import tarfile

ImportError: cannot import name 'tarfile' from 'backports' (/Users/skywalk/py311/lib/python3.11/site-packages/backports/init.py)

复制代码
python pyramid_app.py
Traceback (most recent call last):
  File "/Users/skywalk/work/fastapi/pyramid_app.py", line 3, in <module>
    from pyramid.config import Configurator
  File "/Users/skywalk/py311/lib/python3.11/site-packages/pyramid/config/__init__.py", line 8, in <module>
    from pyramid.asset import resolve_asset_spec
  File "/Users/skywalk/py311/lib/python3.11/site-packages/pyramid/asset.py", line 2, in <module>
    import pkg_resources
  File "/Users/skywalk/py311/lib/python3.11/site-packages/pkg_resources/__init__.py", line 96, in <module>
    from jaraco.text import (
  File "/Users/skywalk/py311/lib/python3.11/site-packages/setuptools/_vendor/jaraco/text/__init__.py", line 12, in <module>
    from jaraco.context import ExceptionTrap
  File "/Users/skywalk/py311/lib/python3.11/site-packages/setuptools/_vendor/jaraco/context.py", line 17, in <module>
    from backports import tarfile
ImportError: cannot import name 'tarfile' from 'backports' (/Users/skywalk/py311/lib/python3.11/site-packages/backports/__init__.py)

pip安装包解决

python 复制代码
pip install jaraco.context
相关推荐
databook28 分钟前
新数据到手,先跑哪几步检查
python·数据分析
czq_26867194871 小时前
Python打卡第46天
开发语言·python
Flynt2 小时前
日涨4000星的OSINT工具,我拿Linus的用户名和一个随机字符串实测了一遍
python·安全
Evand J3 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter5 小时前
ZPL文件预览
开发语言·c++
曲径海盗5 小时前
【Python 学习第 53 天】列表基础
python·学习笔记·编程入门
Dumbness5 小时前
群里 @ 机器人发"查订单",指令一条都没命中:微信群机器人在路由前漏掉的几步归一化
python·微信
用户1614840955455 小时前
用 M4 Pro 跑羽毛球视频 AI 分析(二):TrackNet MPS 加速 3.2 倍、卡尔曼滤波补漏与自动回合剪辑
python
用户4019925568616 小时前
基于对话树回溯的社媒评论流买方意图识别与噪音过滤实践
python
用户0332126663676 小时前
使用 Python 加密或解密 PDF 文档
python