【FastAPI】--3.进阶教程(二)

【FastAPI】--进阶教程1-CSDN博客

【FastAPI】--基础教程-CSDN博客

目录

1.FastAPI - CORS

​2.FastAPI - CRUD 操作

2.1.Create

2.2.Read

2.3.Update

2.4.Delete

3.FastAPI - 使用 GraphQL

4.FastAPI - Websockets

5.FastAPI - 事件处理程序

6.FastAPI - 安装 Flask 应用程序


1.FastAPI - CORS

Cross-Origin Resource Sharing (CORS) 是指在一个客户端浏览器上运行的前端应用程序试图通过 JavaScript 代码与后端通信,而后端与前端位于不同的"来源"的情况。 这里的来源是协议、域名和端口号的组合。 因此,http://localhost 和 https://localhost 的来源不同。

  • 前端运行在 http://localhost:3000,后端运行在 http://localhost:8000
  • 浏览器会阻止前端直接访问后端 API,除非后端配置了 CORS。

要明确指定允许的来源,请导入 CORSMiddleware 并将来源列表添加到应用程序的中间件。

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = ["http://192.168.211.:8000","http://localhost","http://localhost:8080",
]
app.add_middleware(CORSMiddleware,allow_origins=origins,allow_credentials=True,allow_methods=["*"],allow_headers=["*"],
)
@app.get("/")
async def main():return {"message": "Hello World"}

以下是 ​​FastAPI app.add_middleware(CORSMiddleware) 参数​​ 的详细表格说明,涵盖所有核心配置选项及其用途、示例和注意事项:


​CORS 中间件参数完整表格​

参数类型说明
allow_originsList[str]允许访问的源(域名列表)。
allow_origin_regexstr用正则表达式匹配允许的源。
allow_methodsList[str]允许的 HTTP 方法。
allow_headersList[str]允许的请求头。
allow_credentialsbool是否允许跨域携带 Cookie(如 Authorization: Bearer)。
expose_headersList[str]允许前端 JavaScript 访问的响应头。
max_ageint预检请求(OPTIONS)的缓存时间(秒)。

​2.FastAPI - CRUD 操作

CRUD(Create, Read, Update, Delete)是 Web 开发中最基础的操作。FastAPI 实现 CRUD 的完整示例​​,包含 ​​路由设计、请求验证、数据库交互​​ 和 ​​错误处理​​。

(创、读、更新、删除)

REST 架构使用 HTTP 动词或方法来对资源进行操作。 POST、GET、PUT和DELETE方法分别执行CREATE、READ、UPDATE和DELETE操作。

2.1.Create

在下面的示例中,我们将使用 Python 列表作为内存数据库并对其执行 CRUD 操作。 首先,让我们设置一个 FastAPI 应用程序对象并声明一个名为 Book 的 Pydantic 模型。

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
data = []
class Book(BaseModel):id: inttitle: strauthor: strpublisher: str#出版社@app.post("/book")
def add_book(book: Book):data.append(book.dict())return dataif __name__ == "__main__":import uvicornuvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

在Swagger UI中,执行几次这个操作函数并添加一些数据。

2.2.Read

要检索列表,定义绑定到 @app.get() 装饰器的操作函数,如下所示 −

@app.get("/list")
def get_books():return data

要检索一本书,其 id 作为路径参数,定义 get() 操作装饰器和 get_book() 函数如下 −

@app.get("/book/{id}")
def get_book(id: int):id = id - 1return data[id]

2.3.Update

接下来,定义修改数据列表中对象的@app.put()装饰器。 这个装饰器也有一个 id 字段的路径参数。

 ​在 FastAPI 中,@app.put() 用于定义 ​​HTTP PUT 请求​​ 的路由,通常用于 ​​更新资源​​。

@app.put("/book/{id}")
def add_book(id: int, book: Book):data[id] = bookreturn data

 

2.4.Delete

最后,我们定义了@app.delete() 装饰器,用于删除路径参数对应的一个对象。

@app.delete("/book/{id}")
def delete_book(id: int):data.pop(id-1)return data

3.FastAPI - 使用 GraphQL

GraphQL 是一种用于 API 的 ​​查询语言​​ 和 ​​运行时​​,由 Facebook 于 2012 年开发并在 2015 年开源。它提供了一种更高效、灵活且强类型的方式来与 API 交互,尤其适合现代复杂应用(如 React/Vue 前端、移动端等)。 

由于 GraphQL 与 ASGI 兼容,因此可以轻松地与 FastAPI 应用程序集成。 GraphQL 有很多 Python 库。 下面列出了其中一些 −

  • Strawberry

  • Ariadne

  • Tartiflette

  • Graphene

# 导入Strawberry库(用于构建GraphQL服务)
import strawberry# 定义一个Book类型(GraphQL对象类型)
@strawberry.type
class Book:title: str      # 书名(字符串类型)author: str     # 作者(字符串类型)price: int      # 价格(整数类型)# 定义查询入口点
@strawberry.type
class Query:# 定义一个查询字段book,返回Book类型@strawberry.fielddef book(self) -> Book:# 返回一个固定的Book对象实例return Book(title="Computer Fundamentals", author="Sinha", price=300)# 导入FastAPI(用于创建Web服务)
from fastapi import FastAPI
# 导入Strawberry的ASGI适配器
from strawberry.asgi import GraphQL# 创建GraphQL Schema(模式),指定查询入口为Query类
schema = strawberry.Schema(query=Query)# 创建GraphQL应用实例
graphql_app = GraphQL(schema)# 创建FastAPI应用实例
app = FastAPI()# 添加HTTP路由(处理GraphQL查询)
app.add_route("/book", graphql_app)
# 添加WebSocket路由(处理GraphQL订阅)
app.add_websocket_route("/book", graphql_app)# 主程序入口
if __name__ == "__main__":import uvicorn# 使用uvicorn运行FastAPI应用uvicorn.run(app='__main__:app',  # 指定应用对象host='127.0.0.1',    # 监听本地地址port=8000,           # 使用8000端口reload=True          # 开发模式:代码修改后自动重启)

 http://127.0.0.1:8000/book

4.FastAPI - Websockets

WebSocket 是客户端和服务器之间的持久连接,用于在两者之间提供双向、全双工 通信。 通过单个 TCP/IP 套接字连接在 HTTP 上进行通信。 它可以看作是 HTTP 的升级,而不是一个协议本身。

HTTP 的局限性之一是它是一种严格的半双工或单向协议。 另一方面,使用 WebSockets,我们可以发送基于消息的数据,与 UDP 类似,但具有 TCP 的可靠性。 WebSocket 使用 HTTP 作为初始传输机制,但在收到 HTTP 响应后保持 TCP 连接。 同一个连接对象,它可以用于客户端和服务器之间的双向通信。 因此,可以使用 WebSocket API 构建实时应用程序。

FastAPI 通过 FastAPI 模块中的 WebSocket 类支持 WebSockets。 以下示例演示了 WebSocket 在 FastAPI 应用程序中的功能。

1.首先我们有一个index() 函数来渲染一个模板(socket.html)。 它绑定到"/"路由。 HTML 文件 socket.html 位于"templates"文件夹中。

main.py

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates(directory="templates")#模板目录
from fastapi.staticfiles import StaticFiles
app = FastAPI()
app.mount("/static", StaticFiles(directory="./templates/static"), name="static")#静态文件目录
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):return templates.TemplateResponse("socket.html", {"request": request})

 socket.html

<!DOCTYPE html>
<html><head><title>Chat</title><script src="{{ url_for('static', path='ws.js') }}"></script></head><body><h1>WebSocket Chat</h1><form action="" onsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><button>Send</button></form><ul id='messages'></ul></body>
</html>

在 socket.html 中,调用了在表单提交时执行的 JavaScript 函数。 因此,为了服务 JavaScript,首先安装"static"文件夹。 JavaScript 文件 ws.js 位于"static"文件夹中。

 ws.js

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()
}

加载 JavaScript 代码时,它会创建一个监听"ws://localhost:8000/ws"的 websocket。 sendMessage() 函数将输入消息定向到 WebSocket URL。

此路由调用应用程序代码中的 websocket_endpoint() 函数。 传入的连接请求被接受,传入的消息在客户端浏览器上回显。 将以下代码添加到 main.py。

from fastapi import 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}")

整个路由结构:

 5.FastAPI - 事件处理程序

事件处理程序是当某个确定的事件发生时要执行的函数。 在 FastAPI 中,标识了两个这样的事件 −

  1.  startup 
  2. shutdown

FastAPI 的应用程序对象具有 on_event() 装饰器,它使用其中一个事件作为参数。 当相应的事件发生时,使用此装饰器注册的函数将被触发。

这是启动和关闭事件处理程序的简单示例。 当应用程序启动时,开始时间会在控制台日志中回显。 同样,当服务器按ctrl+c停止时,也会显示关机时间。

from fastapi import FastAPI
import datetime
app = FastAPI()
@app.on_event("startup")
async def startup_event():print('Server started :', datetime.datetime.now())
@app.on_event("shutdown")
async def shutdown_event():print('server Shutdown :', datetime.datetime.now())if __name__ == '__main__':import uvicornuvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

6.FastAPI - 安装 Flask 应用程序

用 Flask 或 Django 框架编写的 WSGI 应用程序可以包装在 WSGIMiddleware 中,并将其安装在 FastAPI 应用程序上以使其符合 ASGI 标准。

from flask import Flask
import uvicorn
from fastapi.middleware.wsgi import WSGIMiddleware
from fastapi import FastAPIflask_app = Flask(__name__)
@flask_app.route("/")
def index_flask():return "Hello World from Flask!"app = FastAPI()
@app.get("/")
def index():return {"message": "Hello World from FastAPI!"}app.mount("/flask", WSGIMiddleware(flask_app))if __name__ == '__main__':uvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

使用 mount() 方法将 flask 应用程序挂载为 FastAPI 主应用程序的子应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FEMFAT许可的更新与升级流程

随着工程仿真技术的不断发展&#xff0c;FEMFAT作为一款领先的疲劳分析软件&#xff0c;持续为用户提供卓越的性能和创新的功能。为了保持软件的最新性和高效性&#xff0c;了解FEMFAT许可的更新与升级流程至关重要。本文将为您详细介绍FEMFAT许可的更新与升级流程&#xff0c;…

麒麟v10,arm64架构,编译安装Qt5.12.8

Window和麒麟x86_64架构&#xff0c;官网提供安装包&#xff0c;麒麟arm64架构的&#xff0c;只能自己用编码编译安装。 注意&#xff0c;“桌面”路径是中文&#xff0c;所以不要把源码放在桌面上编译。 1. 下载源码 从官网下载源码&#xff1a;https://download.qt.io/arc…

20250528-C#知识:结构体

C#知识&#xff1a;结构体 结构体是一种自定义数据类型&#xff0c;用户可以根据自身需求设计自己的结构体用来表示某种数据集合。结构体是一种值类型&#xff0c;结合了值类型的优点&#xff0c;避免了引用类型的缺点。本文简单介绍并探究一下C#中的结构体。 结构体一般写在命…

CRM系统的功能模块划分

基础管理模块 用户管理 用户注册与登录角色权限管理部门组织架构用户信息管理 系统设置 基础参数配置系统日志管理数据字典管理系统监控 客户管理模块 客户信息管理 客户基本信息客户分类管理客户标签管理客户关系图谱 联系人管理 联系人信息联系记录沟通历史重要日期提醒 …

Python中的跨域资源共享(CORS)处理

在Web开发中&#xff0c;跨域资源共享&#xff08;CORS&#xff09;是浏览器强制执行的安全机制&#xff0c;用于控制不同源&#xff08;协议域名端口&#xff09;之间的资源交互。下面我将通过Python示例详细讲解CORS的实现。 原生Python实现CORS Flask框架手动实现CORS fr…

Kruskal算法剖析与py/cpp/Java语言实现

Kruskal算法剖析与py/cpp/Java语言实现 一、Kruskal算法的基本概念1.1 最小生成树1.2 Kruskal算法核心思想 二、Kruskal算法的执行流程三、Kruskal算法的代码实现3.1 Python实现3.2 C实现3.3 Java实现 四、算法复杂度分析4.1 时间复杂度4.2 空间复杂度 五、Kruskal算法应用场景…

微信小程序返回上一页监听

本文实现的是微信小程序在返回上一页时获取通知并自定义业务。 最简单的实现&#xff1a; 使用 wx.enableAlertBeforeUnload() 优点&#xff1a;快速接入 缺点&#xff1a;手势不能识别、无法自定义弹窗内容&#xff08;仅询问&#xff09; 方法二&#xff1a; page-conta…

Excel 统计某个字符串在指定区域出现的次数

【本文概要】 Excel 统计某个字符串在指定区域出现的次数&#xff1a; 1、Excel 统计一个单元格内的某字符串的出现次数 2、Excel 统计某一列所有单元格内的某字符串的出现次数 3、Excel 统计某一区域所有单元格内的某字符串的出现次数 1、Excel 统计一个单元格内的某字符串的出…

生物化学:药品药物 营养和补充剂信息 第三方认证信息 常见误区 汇总

常见维生素和矿物质成分表 成分名称好处副作用&#xff08;超量或敏感情况&#xff09;运作方式推荐日剂量&#xff08;成人&#xff09;剂量说明维生素A&#xff08;视黄醇&#xff09;视力、免疫、皮肤健康过量可致肝损伤、头痛、脱发调节视网膜功能、细胞分化700–900 g RA…

mock库知识笔记(持续更新)

文章目录 mock简介导入方式参数简介使用场景&#xff08;待更新&#xff09;常见问题总结&#xff08;待更新&#xff09;Python代码官网 mock简介 mock是一个模拟对象库&#xff0c;具有模拟其他python对象的功能&#xff0c;还能指定模拟对象的返回值和设置模拟对象的属性。…

扇形 圆形 面积公式

✅ 一、圆的面积公式 全圆面积&#xff1a; A circle π r 2 A_{\text{circle}} \pi r^2 Acircle​πr2 ✅ 二、扇形的面积公式&#xff08;两种制式&#xff09; 弧度制&#xff1a; A sector 1 2 r 2 θ A_{\text{sector}} \frac{1}{2} r^2 \theta Asector​21​r2θ …

怎样将win11+ubuntu双系统的ubuntu从机械硬盘迁移至固态硬盘(1)

将 Ubuntu 从机械硬盘迁移到固态硬盘是一个涉及多个步骤的过程。以下是一个基本的迁移指南&#xff1a; 1. 前期准备 1.1 备份数据&#xff1a; 确保你已备份数据&#xff0c;以防止在迁移过程中出现意外导致任何数据丢失。 1.2 固态硬盘安装&#xff1a; 确保固态硬盘正确…

js中common.js和ECMAScript.js区别

以下是关于 CommonJS 和 ECMAScript Modules&#xff08;ESM&#xff09;的详细对比分析&#xff0c;包含底层原理和示例说明&#xff1a; &#x1f9e9; 核心差异对比表 特性CommonJSES Modules来源Node.js 社区规范ECMAScript 语言标准加载方式动态加载&#xff08;运行时解…

玻纤效应的时序偏差

随着比特率继续飙升&#xff0c;光纤编织效应时序偏移正成为一个越来越严重的问题。对于 5GB/s 及以上的信号传输速率&#xff0c;它实际上会毁了您的一天。例如&#xff0c;左图显示由于 12.7 英寸的纤维编织效果&#xff0c;5GB/s 的接收眼完全闭合。使用 Agilent ADS 软件进…

异步上传石墨文件进度条前端展示记录(采用Redis中String数据结构实现)

事件起因是客户现场需要从石墨文档中获取文件信息&#xff0c;文件信息存在存在多个&#xff0c;进行批量上传。为了用户的友好型体验&#xff0c;需要做进行条展示的方式&#xff0c;具体实现见下文… 上传流程介绍 石墨文档支持从链接&#x1f517;方式获取文件信息&#xf…

3D建模的全景图谱:从55个工具到元宇宙的数字革命

3D建模已从专业工程师的工具箱演变为全民创作的数字语言。从代码驱动的精确建模到AI自动生成纹理&#xff0c;从开源协作到程序化生成城市&#xff0c;技术正重塑我们创造虚拟世界的方式。本文将系统解析55个核心3D建模工具/插件&#xff0c;涵盖在线编辑器、开源软件、程序化生…

jsrpc进阶模式 秒杀js前端逆向问题 burp联动进行爆破

案例演示 思路就是 这个 jsrpc远程加载加密函数的方法就是 在js代码中进行插入一个 远程加载的代码 从而实现 &#xff1a; 第一步还是使用 js_tools 进行 查找算法的位置 这个可以帮助我们找到明文>密文 加密算法函数的位置 因为这个需要我们进行js前端代码的修改 所以…

基于BERT-Prompt的领域句子向量训练方法

基于BERT-Prompt的领域句子向量训练方法 一、核心原理:基于BERT-Prompt的领域句子向量训练方法 论文提出一种结合提示学习(Prompt Learning)和BERT的领域句子向量训练方法,旨在解决装备保障领域文本的语义表示问题。核心原理如下: 以下通过具体例子解释传统词向量方法和…

Python PyMySQL

1.PyMySQL是什么 是Python操作mysql的一个包 2.PyMySQL使用基本步骤 2.1 创建连接 conn pymysql.connect(host10.248.53.148,password123456,port3306,userroot,databasetest_database,charsetutf8)2.2 游标 2.2.1 什么是游标 游标实际上是一种能从包括多条数据记录的结果…

OC—UI学习-1

OC—UI学习 UILabel UILabel是UIKit框架中的一个类Label主要参数 text&#xff1a;文本frame&#xff1a;位置框架backgroundcolor&#xff1a;背景颜色textAlignment&#xff1a;设置文本在Label中的位置textColor&#xff1a;文本颜色shadowColor&#xff1a;阴影颜色shado…