FastAPI -- 第三弹(自定义响应、中间件、代理、WebSockets)

路径操作的高级配置

OpenAPI 的 operationId

from fastapi import FastAPIapp = FastAPI()# 通过 operation_id 参数设置
@app.get("/items/", operation_id="some_specific_id_you_define")
async def read_items():return [{"item_id": "Foo"}]

使用 路径操作函数 的函数名作为 operationId

from fastapi import FastAPI
from fastapi.routing import APIRouteapp = FastAPI()@app.get("/items/")
async def read_items():return [{"item_id": "Foo"}]def use_route_names_as_operation_ids(app: FastAPI) -> None:"""Simplify operation IDs so that generated API clients have simpler functionnames.Should be called only after all routes have been added."""for route in app.routes:if isinstance(route, APIRoute):# 个人觉得这种操作挺不错,可以在一个地方统一处理,更有利于建立规范 且方便管理route.operation_id = route.name  # in this case, 'read_items'use_route_names_as_operation_ids(app)

从 OpenAPI 中排除

from fastapi import FastAPIapp = FastAPI()# 使用 include_in_schema 参数并将其设置为 False,
# openapi 文档中就看不到这个接口的信息
# 
# 个人认为,可以作为是否完成的开关使用,默认设置 False,当接口完成开发后设置为 True
@app.get("/items/", include_in_schema=False)
async def read_items():return [{"item_id": "Foo"}]

docstring 的高级描述

from typing import Set, Unionfrom fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: Union[str, None] = Noneprice: floattax: Union[float, None] = Nonetags: Set[str] = set()@app.post("/items/", response_model=Item, summary="Create an item")
async def create_item(item: Item):"""Create an item with all the information:- **name**: each item must have a name- **description**: a long description- **price**: required- **tax**: if the item doesn't have tax, you can omit this- **tags**: a set of unique tag strings for this item> \\f : 换页 的转义字符 1 <br/>> 比较有意思的是,这里可以按照 Markdown 的语法写文档注释> Swagger UI 只支持一些简单的 Markdown 语法> 比如现在的 `>` Swagger UI就不支持,但是 ReDoc 支持> 但是比较遗憾的是 这两者对 Markdown 的语法支持的不够完善但是比较遗憾的是 这两者都不支持换行但是比较遗憾的是 这两者都不支持换行但是比较遗憾的是 这两者都不支持换行`\n` 和 `<br/>` 两者的换行还不一样对于 `>` 中的换行 要使用 `<br/>`, 不然会作为两段 引用,只能说对于 Markdown语法的支持两者都有提升空间啊\f\\f : 换页 的转义字符 2换页的内容,不会再 上面提到的两者中 进行展示比较有意思的是,这里可以按照 Markdown 的语法写文档注释然后在文档中就会按照 Markdown 的样式进行展示:param item: User input."""return item

自定义响应

使用 ORJSONResponse

如果你需要压榨性能,你可以安装并使用 orjson 并将响应设置为 ORJSONResponse

from fastapi import FastAPI
from fastapi.responses import ORJSONResponseapp = FastAPI()# 使用 ORJSONResponse 代替 JSONResponse
@app.get("/items/", response_class=ORJSONResponse)
async def read_items():return ORJSONResponse([{"item_id": "Foo"}])

StreamingResponse

如果您有类似文件的对象(例如,由 open() 返回的对象),则可以在 StreamingResponse 中将其返回

from fastapi import FastAPI
from fastapi.responses import StreamingResponsesome_file_path = "large-video-file.mp4"
app = FastAPI()@app.get("/")
def main():def iterfile():  # (1)with open(some_file_path, mode="rb") as file_like:  # (2)yield from file_like  # (3)# 使用 StreamingResponse 返回数据return StreamingResponse(iterfile(), media_type="video/mp4")

FileResponse

异步传输文件作为响应。

from fastapi import FastAPI
from fastapi.responses import FileResponsesome_file_path = "large-video-file.mp4"
app = FastAPI()@app.get("/")
async def main():return FileResponse(some_file_path)

响应 Cookies

使用 Response 参数


app = FastAPI()@app.post("/cookie-and-object/")
def create_cookie(response: Response):# 定义一个 response: Response 的参数# 调用 set_cookieresponse.set_cookie(key="fakesession", value="fake-cookie-session-value")return {"message": "Come to the dark side, we have cookies"}

直接响应 Response

from fastapi import FastAPI
from fastapi.responses import JSONResponseapp = FastAPI()@app.post("/cookie/")
def create_cookie():content = {"message": "Come to the dark side, we have cookies"}# 创建一个 Response 或其子类 对象response = JSONResponse(content=content)# 调用 set_cookieresponse.set_cookie(key="fakesession", value="fake-cookie-session-value")return response

响应头

和 响应Cookies 类似也有两种方式

使用 Response 参数

from fastapi import FastAPI, Responseapp = FastAPI()@app.get("/headers-and-object/")
def get_headers(response: Response):# 声明一个 Response 类的形参# 像字典添加 键值对 一样,往 headers中添加键值对response.headers["X-Cat-Dog"] = "alone in the world"return {"message": "Hello World"}

直接返回 Response

from fastapi import FastAPI
from fastapi.responses import JSONResponseapp = FastAPI()@app.get("/headers/")
def get_headers():content = {"message": "Hello World"}# 将要返回的响应头信息先存到字典中 header_dict header_dict = {"X-Cat-Dog": "alone in the world", "Content-Language": "en-US"}# 通过 kv 形式设置 headers, headers=header_dict return JSONResponse(content=content, headers=header_dict )

直接使用请求

from fastapi import FastAPI, Requestapp = FastAPI()@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):# 声明一个形参 request: Request# 可以从 request 中得到请求信息client_host = request.client.hostreturn {"client_host": client_host, "item_id": item_id}

添加 ASGI 中间件

from fastapi import FastAPI
from unicorn import UnicornMiddlewareapp = FastAPI()# 通过 FastAPI 的实例 app 调用 add_middleware 方法添加中间件 
app.add_middleware(UnicornMiddleware, some_config="rainbow")

使用代理

在这里插入图片描述

在 FastAPI 应用里设置 root_path

from fastapi import FastAPI, Request# 将 "/api/v1" 赋值给 root_path
app = FastAPI(root_path="/api/v1")@app.get("/app")
def read_main(request: Request):return {"message": "Hello World", "root_path": request.scope.get("root_path")}

附加的服务器(多环境部署时)

from fastapi import FastAPI, Request# 可以通过 servers,将多个环境的地址以列表的形式赋值给 servers
app = FastAPI(servers=[{"url": "https://stag.example.com", "description": "Staging environment"},{"url": "https://prod.example.com", "description": "Production environment"},],root_path="/api/v1",# 将 root_path 从 servers 剔除,root_path_in_servers=False# 默认 servers 会包含 root_path, root_path_in_servers=True# root_path_in_servers=False,
)@app.get("/app")
def read_main(request: Request):return {"message": "Hello World", "root_path": request.scope.get("root_path")}

WebSockets

安装 WebSockets

pip install websockets

创建 websocket

from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponseapp = FastAPI()html = """
<!DOCTYPE html>
<html><head><title>Chat</title></head><body><h1>WebSocket Chat</h1><form action="" οnsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><button>Send</button></form><ul id='messages'></ul><script>var ws = new WebSocket("ws://localhost:8000/ws");ws.onmessage = function(event) {var messages = document.getElementById('messages')var message = document.createElement('li')var content = document.createTextNode(event.data)message.appendChild(content)messages.appendChild(message)};function sendMessage(event) {var input = document.getElementById("messageText")ws.send(input.value)input.value = ''event.preventDefault()}</script></body>
</html>
"""@app.get("/")
async def get():return HTMLResponse(html)# 通过 app.websocket 创建一个 websocket 
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):# 接收消息await websocket.accept()while True:data = await websocket.receive_text()# 发送消息await websocket.send_text(f"Message text was: {data}")

事件:启动 - 关闭

startup 事件

from fastapi import FastAPIapp = FastAPI()items = {}# 通过 app.on_event("startup") ”声明“一个函数为启动函数
# 可以做一些预处理工作,比如 往数据库中写入一些初始数据
@app.on_event("startup")
async def startup_event():items["foo"] = {"name": "Fighters"}items["bar"] = {"name": "Tenders"}@app.get("/items/{item_id}")
async def read_items(item_id: str):return items[item_id]

shutdown 事件

from fastapi import FastAPIapp = FastAPI()# 通过 app.on_event("shutdown") ”声明“一个函数为关闭函数
@app.on_event("shutdown")
def shutdown_event():with open("log.txt", mode="a") as log:log.write("Application shutdown")@app.get("/items/")
async def read_items():return [{"name": "Foo"}]

到此结  DragonFangQy 2024.07.18

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3249354.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【MQTT(3)】开发一个客户端,QT-Android安卓手机版本

手机版本更加方便 生成安卓库 参考了这个代码 在编译Mosquitto以支持安卓平台时&#xff0c;主要涉及到使用Android NDK&#xff08;Native Development Kit&#xff09;进行交叉编译。环境的准备参考之前的博客【QT开发&#xff08;17&#xff09;】2023-QT 5.14.2实现Andr…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.1计算机软硬件与2.1.2计算机网络

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

网络编程-TCP 协议的三次握手和四次挥手做了什么

TCP 协议概述 1. TCP 协议简介 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 协议提供可靠的通信服务&#xff0c;通过校验和、序列号、确认应答、重传等机制保证数据传输…

vue v-for展示元素分两栏 中间使用分割线

1.效果展示: 2.代码展示: <template><div class"container"><div class"column" v-for"(item, index) in items" :key"index"><div class"item">{{ item }}</div><div v-if"index %…

Linux编辑器——vim的使用

目录 vim的基本概念 命令模式 底行模式 插入模式 注释和取消注释 普通用户进行sudo提权 vim配置问题 vim的基本概念 一般使用的vim有三种模式&#xff1a; 命令模式 底行模式和插入模式&#xff0c;可以进行转换&#xff1b; vim filename 打开vim&#xff0c;进入的…

专题四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

基于电鸿(电力鸿蒙)的边缘计算网关,支持定制

1 产品信息 边缘计算网关基于平头哥 TH1520 芯片&#xff0c;支持 OpenHarmony 小型系统&#xff0c;是 连接物联网设备和云平台的重要枢纽&#xff0c;可应用于城市基础设施&#xff0c;智能工厂&#xff0c;智能建筑&#xff0c;营业网点&#xff0c;运营 服务中心相关场…

学习react-环境手脚架页面路由

1. 搭建环境 安装node和npm 在下面网址下载node&#xff0c;并安装 https://nodejs.cn/ #检测是否ok node -v npm -v安装react npm install -g create-react-app2. 创建手脚架&#xff08;TypeScript&#xff09; create-react-app my-app --template typescript cd my-a…

CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection

CrossKD&#xff1a;用于密集目标检测的交叉头知识蒸馏 论文链接&#xff1a;https://arxiv.org/abs/2306.11369v2 项目链接&#xff1a;https://github.com/jbwang1997/CrossKD Abstract 知识蒸馏(Knowledge Distillation, KD)是一种有效的学习紧凑目标检测器的模型压缩技术…

huawei USG6001v1学习---信息安全概念

目录 1.什么是分布式&#xff1f; 2.什么是云计算&#xff1f; 3.APT攻击 4.安全风险能见度不足 5.常见的一些攻击 6.交换机转发原理&#xff1f; 7.各层攻击类型 7.1链路层&#xff1a; 7.2网络层&#xff1a; 7.3传输层&#xff1a; 7.4应用层&#xff1a; 1.什么…

Spring-Boot基础--yaml

目录 Spring-Boot配置文件 注意&#xff1a; YAML简介 YAML基础语法 YAML:数据格式 YAML文件读取配置内容 逐个注入 批量注入 ConfigurationProperties 和value的区别 Spring-Boot配置文件 Spring-Boot中不用编写.xml文件&#xff0c;但是spring-Boot中还是存在.prope…

TCP系列(一)-介绍TCP

服务 TCP和UDP同样使用IP提供的服务&#xff0c;但是TCP提供的是面向连接&#xff0c;可靠的字节流服务 面向连接 使用TCP进行通信双方&#xff0c;必须先建立连接&#xff0c;然后进行数据交换 可靠服务 将应用数据分割成固定大小的报文段每次发出报文&#xff0c;会启动定时…

谷粒商城-全文检索-ElasticSearch

1.简介 一个分布式的开源搜索和分析引擎,可以 秒 级的从海量数据中检索 主要功能:做数据的检索和分析(MySQL专攻于数据的持久化存储与管理CRUD达到百万以上的数据MSQL就会很慢,海量数据的检索和分析还是要用ElasticSearch) 用途:我们电商项目里的所有的检索功能都是由Elasti…

STM32智能城市交通管理系统教程

目录 引言环境准备智能城市交通管理系统基础代码实现&#xff1a;实现智能城市交通管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;城市交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能城…

用EXCEL和python 计算马尔可夫链转移矩阵

目录 目标&#xff1a;用EXCEL和python 计算马尔可夫链转移矩阵 1 用EXCEL计算 1.1 马尔可夫链的基本应用 1.2 具体计算 2 用python计算马尔可夫转移矩阵 2.1 py代码 2.2 运行结果 3 上面2者计算结果相同 目标&#xff1a;用EXCEL和python 计算马尔可夫链转移矩阵 1 用…

<数据集>混凝土缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;7353张 标注数量(xml文件个数)&#xff1a;7353 标注数量(txt文件个数)&#xff1a;7353 标注类别数&#xff1a;6 标注类别名称&#xff1a;[exposed reinforcement, rust stain, Crack, Spalling, Efflorescence…

StarRocks on AWS Graviton3,实现 50% 以上性价比提升

在数据时代&#xff0c;企业拥有前所未有的大量数据资产&#xff0c;但如何从海量数据中发掘价值成为挑战。数据分析凭借强大的分析能力&#xff0c;可从不同维度挖掘数据中蕴含的见解和规律&#xff0c;为企业战略决策提供依据。数据分析在营销、风险管控、产品优化等领域发挥…

PHP房产中介租房卖房平台微信小程序系统源码

​&#x1f3e0;【租房卖房新选择】揭秘房产中介小程序&#xff0c;一键搞定置业大事&#xff01;&#x1f3e1; &#x1f50d;【开篇&#xff1a;告别繁琐&#xff0c;拥抱便捷】&#x1f50d; 还在为找房子跑断腿&#xff1f;为卖房发愁吗&#xff1f;今天给大家安利一个超…

【.NET全栈】ASP.NET开发Web应用——AJAX开发技术

文章目录 前言一、ASP.NET AJAX基础1、AJAX技术简介2、ASP.NET AJAX技术架构 二、ASP.NET AJAX服务器端扩展1、声明ScriptManager控件2、使用ScriptManager分发自定义脚本3、在ScriptManager中注册Web服务4、处理ScriptManager中的异常5、编程控制ScriptManager控件6、使用Upda…

GPT LangChain experimental agent - allow dangerous code

题意&#xff1a;GPT LangChain 实验性代理 - 允许危险代码 问题背景&#xff1a; Im creating a chatbot in VS Code where it will receive csv file through a prompt on Streamlit interface. However from the moment that file is loaded, it is showing a message with…