以下是一个整合 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"}

功能说明与最佳实践:

  1. WebSocket 实现

    • 使用内存列表管理活动连接

    • 支持文本消息的实时广播

    • 异常时自动清理失效连接

    • 前端可通过 new WebSocket('ws://localhost:8000/ws/chat') 连接

  2. 后台任务处理

    BackgroundTasks 支持同步/异步混合任务

    • CPU密集型任务自动使用线程池

    • 异步IO任务直接运行在事件循环中

    • 生产环境建议结合 Celery 处理分布式任务

  3. 生命周期管理

    • 替代已废弃的 startup/shutdown 事件

    • 支持异步资源初始化(数据库连接池等)

    • 确保资源释放的可靠性(try/finally 结构)

  4. 中间件配置

    • CORS 配置支持跨域请求

    • GZip 压缩优化响应速度

    • 静态文件服务通过 /static 路径提供

  5. 会话管理

    • 安全 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、后台任务、生命周期事件、中间件配置及会话管理的更多相关文章

  1. c语言智能指针 附完整示例代码

    是的,你没有看错, 不是c++不是c#, 就是你认识的那个c语言. 在很长一段时间里,c的内存管理问题, 层出不穷,不是编写的时候特别费劲繁琐, 就是碰到内存泄漏排查的各种困难, 特别在多线程环境下, ...

  2. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  3. 看完48秒动画,让你不敢再登录HTTP网站(附完整示例代码)

    在我的 单点登录SSO示例代码 一文中,强烈不建议部署HTTP的SSO服务站点. 在此写个基于网络包嗅探的HTTP会话劫持程序,给大家一个直观的危害性展示. 示例中,我在一台Mac上登录58同城,被另 ...

  4. k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)

    目录 1.命名空间namespace 1.1 什么是命名空间? 1.2 namespace应用场景 1.3 namespacs常用指令 1.4 namespace资源限额 2.标签 2.1 什么是标签 ...

  5. Ajax原理,技术封装与完整示例代码

    在做项目和学习的时候,经常用到Ajax的相关技术,但是这方面的技术总是运用的不是十分好,就寻找相关博客来学习加深Ajax技术相关. 一.Ajax简介 二.同步.异步传输区别 2.1 异步传输 2.2 ...

  6. js 分享代码--完整示例代码

    <div class="bdsharebuttonbox" data-tag="share_1"> <a class="bds_ms ...

  7. Java线程的等待与唤醒完整示例代码

    项目结构: 资源类: 输入线程:  输出线程: 测试: 人妖问题发生: 线程安全问题的解决方法: 调用Object的wait()和notify()方法时需注意:必须是锁对象方可调用,否则将抛出无效的监 ...

  8. WebRTC 音频采样算法 附完整C++示例代码

    之前有大概介绍了音频采样相关的思路,详情见<简洁明了的插值音频重采样算法例子 (附完整C代码)>. 音频方面的开源项目很多很多. 最知名的莫过于谷歌开源的WebRTC, 其中的音频模块就包 ...

  9. 音频降噪算法 附完整C代码

    降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...

  10. 浮点数据有损压缩算法 附完整C代码

    在几年前的时候在做修图APP算法的时候, 曾经一度想过对3D Lut 预设数据进行压缩, 主要用于提升用户体验. 关于3d lut算法开源的资源也挺多的,就不多做科普了. 有兴趣的朋友,可以去查阅下f ...

随机推荐

  1. 常见的HTML特殊字符:对钩与叉号,五角星

    表示"对钩","叉号"的特殊转义符号汇总: 对钩符号 编码 描述 叉号符号 编码 描述 ✓ ✓ CHECK MARK 手写体对钩(细) ✗ ✗ BALLOT X ...

  2. cmake:引入第三方库

    需求:开源库中一般都需要引入第三方库,下面以引入boost库为例 (1)安装所需的三方库 boost安装:参考 (2)引入 这里的cmakelists文件为: # Import Boost (for ...

  3. C:条件编译

    问题 #ifdef HELIB_DEBUG long pa, pb; std::vector<long> slots; decryptBinaryNums(slots, a, *dbgKe ...

  4. linux:配置NTP

    介绍 网络时间协议(Network Time Protocol,NTP),用于同步网络中各个计算机的时间的协议.其用途是将计算机的时钟同步到世界协调时 UTC. ntpd(Network Time P ...

  5. 学弟一看就会的RDKX5模型转换及部署,你确定不学?

    作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 宿主机环境:WSL2-Ubuntu22.04+Cuda12.6.D-Robotics-OE 1.2.8.Ubun ...

  6. 为什么UNIX使用init进程启动其他进程?

    为什么UNIX使用init进程启动其他进程? 在UNIX系统中,当系统启动时,内核完成初始化后会启动第一个用户空间进程,通常是init进程.init进程负责启动和管理其他用户空间进程,而内核本身并不直 ...

  7. SOUI4中使用文件资源

    一直以前SOUI中引用资源都是通过uires.idx中定义资源类型及路径,比如: <?xml version="1.0" encoding="utf-8" ...

  8. Monaco Editor 中使用在线版 Copilot

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:文长 引言 现代软件开发中,代码编辑器的功能不断演进,以满 ...

  9. Chrome 133 里程碑式更新 - moveBefore, 或开启前端框架未来新纪元?

    相关背景: Chrome 133 版本(将于 2 月 4 日发布稳定版)引入了一个新的 DOM 操作方法:Node.prototype.moveBefore.这一方法虽然看似简单,但其意义重大,因为它 ...

  10. Opencv | 图形学 | Mingw64 | 如何正确地用MinGW64编译与配置vscode的Opencv环境

    如何正确地用MinGW64编译与配置vscode的Opencv环境 1.前情提要 最近有关于图形学的授课,教授开始布置的上机打码的代码实现作业了.虽说教授为了让我们省心,直接就整了个环境已经配置好的几 ...