以下是一个整合 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. 面向对象(下)的阶段性复习:关键字abstract、模板方法的设计模式、关键字interface、代理模式、工厂的设计模式、类的结构内部类

    关键字:abstract abstract: 抽象的1.可以用来修饰:类.方法2.具体的:abstract修饰类:抽象类 * > 此类不能实例化 * > 抽象类中一定有构造器,便于子类实例 ...

  2. Node.js 与 PostgreSQL 集成:深入 pg 模块的应用与实践

    title: Node.js 与 PostgreSQL 集成:深入 pg 模块的应用与实践 date: 2025/2/5 updated: 2025/2/5 author: cmdragon exce ...

  3. 在Windows系统中安装Open WebUI并连接Ollama

    一.Open WebUI简介与安装前准备 Open WebUI是一个开源的大语言模型(LLM)交互界面,支持本地部署与离线运行.通过它,用户可以在类似ChatGPT的网页界面中,直接操作本地运行的Ol ...

  4. mongo数据库CPU使用率飙高及优化

    出现的情况 某天高高兴兴上班,发现一台mongo数据库负载较高,达到了300多,且一直很稳定,难道是硬件过时了. 检查主机的资源使用发现一个mongod进程使用了几乎所有的CPU资源. top - 1 ...

  5. Deepseek学习随笔(2)--- 快速上手DeepSeek

    注册与登录 要开始使用 DeepSeek,你需要先注册一个账号.以下是具体步骤: 访问 DeepSeek 官网. 使用邮箱或手机号注册账号. 登录后进入控制台,开始使用. 控制台功能介绍 DeepSe ...

  6. 个人文件转移工具-来自某位大神的C盘清理神器

    软件名称:个人文件转移工具 软件功能:文件转移 支持平台:Windows 软件简介:一款文件转移工具,也可用作C盘瘦身. 软件特点: ◉ "个人文件转移工具"可以把"我的 ...

  7. TDH - 如何显示Guardian Client角色

    注意:本博客适用TDH版本4.3.x 默认该页面的 Guardian Client 是隐藏的,如果需要对 Guardian Client角色进行什么操作的话,需要先将 Guardian Client角 ...

  8. Task VS ValueTask

    在 C# 中,异步编程是构建响应式应用程序的基础.Task 是表示异步操作的首选类型.但是,在某些高性能场景中,与 Task 相关的开销可能会达到一个瓶颈.ValueTask 是 .NET Core ...

  9. Python基础笔记-Python基础知识(环境、Python解释器、环境变量、基础语法、数据类型等)

    前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...

  10. php获取类名

    <?php class ParentClass { public static function getClassName() { return __CLASS__; } } class Chi ...