以下是一个整合 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 网页转 PDF 并导出🤓

    有个新需求,当点击[下载]按钮时,直接将当前 html页面下载为 PDF.通过 html2canvas + jsPDF 可实现PDF单页下载,甚至是多页下载,记录分享一下~ 最后有源码,可自取 htm ...

  2. w3cschool-Jenkins中文文档

    https://www.w3cschool.cn/jenkins/ Jenkins中文文档  阅读(1173.5k)收藏赞(54)分享 手册简介 Jenkins是一个开源的持续集成的服务器,Jenki ...

  3. 告别虚拟机!WSL2安装配置教程!!!

    作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 由于Linux的系统的稳定以及在环境管理方面的优越性,同时Linux对于ROS系统的独占,很多时候我们都乐意在L ...

  4. sql注入学校后台

    有运气成分,遇到两个学校,子域名查询了一下发现有登录平台,然后就直接sql了 payload:admin'or 1=1--+ 很离谱,这年头这两学校还能直接被sql进入后台. 然后进学校后台后就可以直 ...

  5. 输入输出-python

    输入输出-python 输入输出 输入 Python提供了input()函数用于从控制台输入数据. name = input("请输入您的姓名:") print("您输入 ...

  6. ORACLE存储过程中使用游标+BULK COLLECT的应用

    经过半天的折腾,编译通过调试结果正确,掌握此过程中的知识点,oracle存储过程编写就应用到了90%. CREATE OR REPLACE PROCEDURE JUNAN.P_IPT_QUOTN_IN ...

  7. Apache Camel系列(2)----Hello World

    下面创建一个Apache Camel的Hello World程序,该程序使用Maven,Intellij 15,运行环境是JDK 8.   1,创建一个maven工程,在pom.xml文件中添加apa ...

  8. Sa-Token v1.20.0 发布,新增临时Token认证

    框架介绍 Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证.权限认证.分布式Session会话.单点登录.OAuth2.0 等一系列权限相关问题. 框架针对踢人下线.自动续签.前后 ...

  9. Vue3+NestJS实现后台权限管理系统上线啦!(附源码及教程)

    最近这段时间工作不忙,想着提升一下自己的技术,沉淀沉淀.于是做了一个开源的后台权限管理系统.因为我本身是一个前端开发,所以前端和服务端都是用的 JS 语言来开发的,前端用的框架是 vue3,后端则用的 ...

  10. 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章

    2025年2月25日,.NET团队在博客上宣布了.NET 10 Preview 1的正式发布,文章参见:https://devblogs.microsoft.com/dotnet/dotnet-10- ...