FastAPI 核心功能的完整示例代码,涵盖 WebSocket、后台任务、生命周期事件、中间件配置及会话管理
以下是一个整合 FastAPI 核心功能的完整示例代码,涵盖 WebSocket、后台任务、生命周期事件、中间件配置及会话管理。代码结构参考了多个技术文档的最佳实践:
from contextlib import asynccontextmanager
from fastapi import FastAPI, WebSocket, Request, Response, BackgroundTasks
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import StreamingResponse
import asyncio
# ===== 生命周期事件 =====
@asynccontextmanager
async def lifespan(app: FastAPI):
# 启动时初始化资源(数据库连接等)
print(" Application starting...")
yield
# 关闭时释放资源
print(" Application shutting down...")
app = FastAPI(lifespan=lifespan)
# ===== 中间件配置 =====
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"]
)
app.add_middleware(GZipMiddleware, minimum_size=1024) # 压缩大于1KB的响应
# ===== 静态文件服务 =====
app.mount("/static", StaticFiles(directory="static"), name="static")
# ===== WebSocket 实现 =====
active_connections = []
@app.websocket("/ws/chat")
async def websocket_chat(websocket: WebSocket):
await websocket.accept()
active_connections.append(websocket)
try:
while True:
data = await websocket.receive_text()
# 广播消息给所有客户端
for conn in active_connections:
await conn.send_text(f"User: {data}")
except Exception:
active_connections.remove(websocket)
# ===== 后台任务处理 =====
def cpu_intensive_task(message: str):
"""模拟CPU密集型任务"""
import time
time.sleep(5)
return f"Processed: {message}"
async def async_io_task(message: str):
"""模拟异步IO任务"""
await asyncio.sleep(3)
return f"Async: {message}"
@app.post("/tasks")
async def create_task(
bg_tasks: BackgroundTasks,
message: str = "default"
):
# 添加两种类型的后台任务
bg_tasks.add_task(async_io_task, message)
bg_tasks.add_task(cpu_intensive_task, message)
return {"status": "Tasks started"}
# ===== 流式响应 =====
async def generate_logs():
"""实时日志生成器"""
for i in range(10):
yield f"data: Log entry {i}\n\n"
await asyncio.sleep(1)
@app.get("/stream-logs")
async def stream_logs():
return StreamingResponse(generate_logs(), media_type="text/event-stream")
# ===== 会话与Cookie管理 =====
@app.get("/set-cookie")
async def set_cookie(response: Response):
response.set_cookie(
key="user_token",
value="encrypted_value_123",
max_age=3600,
httponly=True,
samesite="Lax"
)
return {"message": "Cookie set"}
@app.get("/get-cookie")
async def get_cookie(request: Request):
token = request.cookies.get("user_token")
return {"token": token or "No cookie found"}
功能说明与最佳实践:
WebSocket 实现
• 使用内存列表管理活动连接
• 支持文本消息的实时广播
• 异常时自动清理失效连接
• 前端可通过new WebSocket('ws://localhost:8000/ws/chat')连接后台任务处理
•BackgroundTasks支持同步/异步混合任务
• CPU密集型任务自动使用线程池
• 异步IO任务直接运行在事件循环中
• 生产环境建议结合 Celery 处理分布式任务生命周期管理
• 替代已废弃的startup/shutdown事件
• 支持异步资源初始化(数据库连接池等)
• 确保资源释放的可靠性(try/finally 结构)中间件配置
• CORS 配置支持跨域请求
• GZip 压缩优化响应速度
• 静态文件服务通过/static路径提供会话管理
• 安全 Cookie 设置(httpOnly, SameSite)
• 支持服务端主动设置 Cookie
• 建议生产环境使用 JWT 或 Redis 会话存储
部署建议:
# 安装依赖
pip install uvicorn[standard] websockets
# 开发模式运行
uvicorn main:app --reload --ws-ping-interval 30
# 生产模式
uvicorn main:app --workers 4 --timeout-keep-alive 30
此实现综合了 FastAPI 的核心功能,可根据具体业务需求扩展 ORM 集成(推荐 SQLAlchemy 或 Tortoise-ORM)、身份验证系统(推荐 OAuth2 with JWT)和监控中间件(推荐 Prometheus)。
FastAPI 核心功能的完整示例代码,涵盖 WebSocket、后台任务、生命周期事件、中间件配置及会话管理的更多相关文章
- c语言智能指针 附完整示例代码
是的,你没有看错, 不是c++不是c#, 就是你认识的那个c语言. 在很长一段时间里,c的内存管理问题, 层出不穷,不是编写的时候特别费劲繁琐, 就是碰到内存泄漏排查的各种困难, 特别在多线程环境下, ...
- springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置
Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...
- 看完48秒动画,让你不敢再登录HTTP网站(附完整示例代码)
在我的 单点登录SSO示例代码 一文中,强烈不建议部署HTTP的SSO服务站点. 在此写个基于网络包嗅探的HTTP会话劫持程序,给大家一个直观的危害性展示. 示例中,我在一台Mac上登录58同城,被另 ...
- k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)
目录 1.命名空间namespace 1.1 什么是命名空间? 1.2 namespace应用场景 1.3 namespacs常用指令 1.4 namespace资源限额 2.标签 2.1 什么是标签 ...
- Ajax原理,技术封装与完整示例代码
在做项目和学习的时候,经常用到Ajax的相关技术,但是这方面的技术总是运用的不是十分好,就寻找相关博客来学习加深Ajax技术相关. 一.Ajax简介 二.同步.异步传输区别 2.1 异步传输 2.2 ...
- js 分享代码--完整示例代码
<div class="bdsharebuttonbox" data-tag="share_1"> <a class="bds_ms ...
- Java线程的等待与唤醒完整示例代码
项目结构: 资源类: 输入线程: 输出线程: 测试: 人妖问题发生: 线程安全问题的解决方法: 调用Object的wait()和notify()方法时需注意:必须是锁对象方可调用,否则将抛出无效的监 ...
- WebRTC 音频采样算法 附完整C++示例代码
之前有大概介绍了音频采样相关的思路,详情见<简洁明了的插值音频重采样算法例子 (附完整C代码)>. 音频方面的开源项目很多很多. 最知名的莫过于谷歌开源的WebRTC, 其中的音频模块就包 ...
- 音频降噪算法 附完整C代码
降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...
- 浮点数据有损压缩算法 附完整C代码
在几年前的时候在做修图APP算法的时候, 曾经一度想过对3D Lut 预设数据进行压缩, 主要用于提升用户体验. 关于3d lut算法开源的资源也挺多的,就不多做科普了. 有兴趣的朋友,可以去查阅下f ...
随机推荐
- Arcgis加载Geoserver矢量切片
原帖地址 洒家废物 - Arcgis加载Geoserver矢量切片 准备点线面图层并发布图层组 此处我准备了石家庄市的县界名称(点).高速公路(线).县界(面),依次发布geoserver服务,创建图 ...
- 如何发现漏洞之我的多功能武器BurpSuite与全能插件
知识点 1.插件类-武装BurpSuite-漏洞检测&分析辅助 2.插件类-武装谷歌浏览器-信息收集&情报辅助 一.演示案例-插件类-武装BurpSuite-漏洞检测&分析辅助 ...
- java基础知识回顾之java Thread类学习(二)--java多线程安全问题(锁)
上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // ...
- GMP大数库
GMP大数库学习 了解 大数库 在网络安全技术领域中各种加密算法的软件实现始终有一个共同话题是如何在普通的PC机上实现大数运算.普通的PC机内部字长最多时32位或64位,但各种加密算法中为了达到一定安 ...
- C#客户端Json转DataTable
本文转自 https://blog.csdn.net/pinebud55/article/details/52240287 感谢pinebud55分享 之前我们有讨论过c#是如何处理json的,在我的 ...
- 安全可信 | 天翼云自研密钥管理系统(KMS)获得《商用密码产品认证证书》!
近日,天翼云自研密钥管理系统(KMS)通过国家密码管理局安全性审查,符合GM/T 0051<密码设备管理 对称密钥管理技术规范>要求,获得由国家密码管理局商用密码检测中心颁发的<商用 ...
- Windows的MySQL数据库升级(解压包方式)
1.背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 . 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞. 因为 MySQL 的官方补丁,需要 Oracle 的 si ...
- 我来告诉你怎么在macOS上畅玩金铲铲之战
天选福星,灵蛇献瑞,<金铲铲之战>"天选福星"赛季好运上线!请接收这份来自<金铲铲之战>的新春邀约--"天选福星"正式回归,羁绊焕新升级 ...
- Luogu P5663 CSP-J2019 加工零件 题解 [ 绿 ] [ 分层图最短路 ]
加工零件:非常好的一道图论题.CCF 普及组的题目大概也只有图论出的比较巧妙了. 题意简述:给你一张无向图,\(q\) 次询问,判断是否存在一条从 \(a\) 到 \(1\) 且长度为 \(L\) 的 ...
- 20 分钟高效掌握 cursor
本身属于在前端小组的一次小分享,这里做个同步分享. 一.pro 权益说明 目前公司购买了 2 个 pro 月付账号,权益包括无限制 tab 补全与 ai 聊天,但每个月只有 500 个快速请求权益,如 ...