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

embedded/2024/11/14 23:06:52/

官方文档: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 Responsedef 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 uvicornuvicorn.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 ConfiguratorFile "/Users/skywalk/py311/lib/python3.11/site-packages/pyramid/config/__init__.py", line 8, in <module>from pyramid.asset import resolve_asset_specFile "/Users/skywalk/py311/lib/python3.11/site-packages/pyramid/asset.py", line 2, in <module>import pkg_resourcesFile "/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 ExceptionTrapFile "/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

 


http://www.ppmy.cn/embedded/137618.html

相关文章

计算机毕业设计——ssm基于JAVA的求职招聘网站的设计与实现演示录像 2021

作者&#xff1a;程序媛9688开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0…

保研考研机试攻略(满分篇):第二章——满分之路上(1)

&#x1f368;&#x1f368;&#x1f368;高分篇的内容已经将机试可能涉及到的题型及考点都一一列举出来&#xff0c;并给大家提供了练习题目&#xff0c;帮助大家巩固基础加深理解。在大多数院校的机试中&#xff0c;学会高分篇的内容已经足够考到 90 分以上的成绩&#xff0c…

李飞飞从底层逆袭到AI行业先锋改变世界给我带来什么启发?

文章目录 前言艰难的移民历程:从成都到美国的文化冲击经济困境中的坚持:从洗衣店到哈佛梦关键的导师:鲍勃老师的影响与数学天赋的发现学术与创业的选择:听从母亲的建议,走向学术巅峰ImageNet的开创:定义现代图像识别技术的基石中美文化的交融:始终不忘中国身份的她启发前…

【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost

文章目录 1、XGBoost Algorithm2、Comparison of algorithm implementation between Python code and Sentosa_DSML community edition(1) Data reading and statistical analysis(2)Data preprocessing(3)Model Training and Evaluation(4)Model visualization 3、summarize 1…

开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-集成心知天气(二)

一、前言 Qwen-Agent 是一个利用开源语言模型Qwen的工具使用、规划和记忆功能的框架。其模块化设计允许开发人员创建具有特定功能的定制代理,为各种应用程序提供了坚实的基础。同时,开发者可以利用 Qwen-Agent 的原子组件构建智能代理,以理解和响应用户查询。 本篇将介绍如何…

Python →爬虫实践

爬取研究中心的书目 现在&#xff0c;想要把如下网站中的书目信息爬取出来。 案例一 耶鲁 Publications | Yale Law School 分析网页&#xff0c;如下图所示&#xff0c;需要爬取的页面&#xff0c;标签信息是“<p>”&#xff0c;所以用 itemssoup.find_all("p&…

Java集合Queue——针对实习面试

目录 Java集合QueueQueue接口的特点是什么&#xff1f;Queue和Deque的区别&#xff1f;ArrayDeque和LinkedList的区别&#xff1f;什么是PriorityQueue&#xff1f;什么是BlockingQueue&#xff1f; Java集合Queue Queue接口的特点是什么&#xff1f; Queue接口在Java中是一个…

leetcode61:旋转链表

给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#xff1a;[2,0,1…