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 ...
随机推荐
- 前端(四)-jQuery
1.jQuery的基本用法 1.1 jQuery引入 <script src="js/jquery-3.4.1.min.js" type="text/javascr ...
- 浅说 c++20 coroutine
浅说cppcoro 上一篇<浅说c/c++ coroutine>介绍了stackful协程,举了win32 Fiber跟tencent/libco为例. 本篇https://www.cnb ...
- RocketMQ实战—3.基于RocketMQ升级订单系统架构
大纲 1.基于MQ实现订单系统核心流程的异步化改造 2.基于MQ实现订单系统和第三方系统的解耦 3.基于MQ实现将订单数据同步给大数据团队 4.秒杀系统的技术难点以及秒杀商详页的架构设计 5.基于MQ ...
- 安全可信 | 通过双项测试!TeleDB实力亮剑!
近日,天翼云TeleDB数据库在中国信通院"可信数据库"系列测试的赛道上,一次性跨越"分布式事务型数据库基础能力测试"与"性能测试"的双重大 ...
- Linux 服务器防火墙开放端口命令(iptables、firewalld和ufw)
本文主要介绍Linux中,Centos.Ubuntu和Debian开放防火墙端口的命令(iptables.firewalld和ufw)方法. 1.Centos中开放端口 1.systemctl sta ...
- Springboot 3.x 集成Knife4j [踩坑日记]
之前项目用的是SpringBoot2.x 新项目用了SpringBoot3.x版本,引入Knife4j 报错java.lang.TypeNotPresentException: Type javax. ...
- C# Web下的类库 项目中获取程序的运行路径
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
- 【软件开发】C++使用笔记
[软件开发]C++使用笔记 数据类型 值类型 存放在栈空间中的一段内存. T:左值,最普通的变量,是具有变量名且可取地址的值. \(~\) :右值,常量或不具备名称的值,无变量名不可取地址.通常都是一 ...
- 大数据之路Week08_day02 (Flume架构介绍和安装)
Flume架构介绍和安装 写在前面在学习一门新的技术之前,我们得知道了解这个东西有什么用?我们可以使用它来做些什么呢?简单来说,flume是大数据日志分析中不能缺少的一个组件,既可以使用在流处理中,也 ...
- Java 解析XML的几种方式:DOM、SAX、JDOM和DOM4J。
归纳总结Java解析XML主要有四中方式,分别是DOM.SAX.JDOM和DOM4J.其中DOM和SAX是官方包自带,另外两个JDOM和DOM4J是第三方包. 一.此篇测试代码用到的XML情况 . 1 ...