FastAPI 教程

14.3 响应压缩与缓存

FastAPI初学者教程:轻松掌握响应压缩与缓存

FastAPI 教程

这篇为Python初学者设计的FastAPI教程,通过生活化类比和简单示例,详细讲解如何实现响应压缩与缓存,快速上手Web开发,建立编码信心。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

FastAPI入门:从零开始学习响应压缩与缓存

介绍

嗨,Python新手们!如果你已经掌握了Python基础语法,但还没接触过Web开发,别担心。今天,我们将用FastAPI这个超级简单的框架,带你体验如何构建Web应用,并学习两个酷炫的功能:响应压缩缓存。教程以动手实践为主,每个步骤都有代码示例,让你立刻看到成果,建立信心!

为什么选FastAPI? 它就像快餐店的点餐机一样,快速、简单、高效。你不用写太多代码,就能做出功能强大的应用。

准备工作:安装工具

在开始前,确保你已经安装了Python(建议3.7+)。然后,打开终端或命令提示符,运行以下命令安装FastAPI和Uvicorn(一个用于运行FastAPI的服务器):

pip install fastapi uvicorn

成功安装后,你就准备好啦!这已经是第一个“成功时刻”——环境搞定!

第一步:创建第一个FastAPI应用

我们来构建一个最简单的Web应用,感受一下FastAPI的魔力。创建一个新文件 main.py,输入以下代码:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

解释

  • FastAPI() 创建了一个应用实例,就像搭建了一个小网站。
  • @app.get("/") 是一个装饰器,告诉FastAPI:当用户访问根路径(比如 http://localhost:8000/)时,执行下面的函数。
  • read_root() 函数返回一个JSON响应 {"Hello": "World"}

运行应用:在终端中,导航到 main.py 所在目录,运行:

uvicorn main:app --reload

现在,打开浏览器访问 http://localhost:8000/,你应该看到 {"Hello": "World"} 显示出来!恭喜,你刚刚构建了一个Web API——成功时刻!

生活化类比:想象FastAPI就像一个自动售货机,你按一个按钮(访问路径),它就会吐出你想要的物品(响应)。

第二步:引入响应压缩

响应压缩可以减小网络传输的数据大小,让网页加载更快。这就像打包行李时压缩衣服,节省空间,方便携带。在FastAPI中,我们可以通过中间件轻松实现。

更新 main.py

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

# 添加GZip中间件进行响应压缩
app.add_middleware(GZipMiddleware, minimum_size=1000)

@app.get("/")
def read_root():
    return {"message": "这是一个带有压缩响应的示例!", "data": ["item1", "item2", "item3"] * 100}

解释

  • 导入 GZipMiddleware,它是FastAPI内置的压缩中间件。
  • app.add_middleware() 将中间件添加到应用中。minimum_size=1000 表示只有响应大小超过1000字节时才压缩,避免小响应浪费资源。
  • 更新 read_root() 返回一个较大的数据列表,以便观察压缩效果。

测试:重新运行应用(如果还在运行,它会自动重启,因为用了 --reload)。访问 http://localhost:8000/,浏览器开发者工具的Network标签中,查看响应头,你会看到 Content-Encoding: gzip,表示压缩已生效——又一个成功时刻!

生活化类比:压缩就像用吸尘器把空气挤出去,让包裹变小;这里,GZip中间件自动“吸走”多余数据,让响应更快传输。

第三步:引入缓存

缓存可以存储常用响应,减少服务器负担,提升用户体验。这就像记下常去餐厅的菜单,下次点餐时不用重新看,直接选。在FastAPI中,我们可以用简单的方法模拟缓存。

继续更新 main.py

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware
import time

app = FastAPI()
app.add_middleware(GZipMiddleware, minimum_size=1000)

# 模拟一个简单的缓存字典
cache = {}

@app.get("/cached-data")
def get_cached_data():
    key = "cached_key"
    if key in cache:
        # 如果缓存中有数据,直接返回
        return {"source": "cache", "data": cache[key]}
    else:
        # 模拟一个耗时操作,比如从数据库获取数据
        time.sleep(2)  # 延迟2秒,模拟处理时间
        data = {"info": "这是新鲜获取的数据!", "timestamp": time.time()}
        cache[key] = data  # 存储到缓存
        return {"source": "fresh", "data": data}

@app.get("/")
def read_root():
    return {"message": "FastAPI教程:压缩与缓存示例", "links": ["/", "/cached-data"]}

解释

  • 添加 time 模块来模拟处理延迟。
  • 创建一个简单的字典 cache 作为缓存存储。
  • 定义一个新路径 /cached-data,它先检查缓存:如果有数据,立即返回(标记为来自缓存);否则,模拟耗时操作后,获取数据并存入缓存。
  • 更新根路径,提供导航链接。

测试:重新运行应用。

  • 首次访问 http://localhost:8000/cached-data,你会看到延迟2秒后返回 {"source": "fresh", ...}
  • 再次快速访问同一路径,立即返回 {"source": "cache", ...},没有延迟!缓存生效了——成功时刻,体验到了速度提升!

生活化类比:缓存就像你的大脑记住常用电话号码;首次查找需要时间,但记住后,下次一喊就来。

第四步:结合使用压缩和缓存

现在,让我们把压缩和缓存结合起来,创建一个更高效的示例。更新 main.py

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware
import time

app = FastAPI()
app.add_middleware(GZipMiddleware, minimum_size=500)  # 降低压缩阈值,更频繁压缩

cache = {}

@app.get("/optimized")
def get_optimized_data():
    key = "optimized_key"
    if key in cache:
        return {"source": "cache", "data": cache[key], "compressed": True}
    else:
        time.sleep(1)  # 模拟较短延迟
        data = {"message": "这是优化后的响应!", "items": ["a", "b", "c"] * 50}
        cache[key] = data
        return {"source": "fresh", "data": data, "compressed": True}

@app.get("/")
def read_root():
    return {"title": "FastAPI压缩与缓存实战", "endpoints": ["/", "/optimized"]}

解释

  • 将压缩阈值设为500字节,确保响应被压缩。
  • 创建 /optimized 路径,结合缓存和压缩:首次访问延迟1秒并存储数据,后续访问无延迟,且响应都被压缩。

测试:运行应用,访问 http://localhost:8000/optimized。首次稍慢,之后秒开,并且在Network中检查 Content-Encoding: gzip。你成功构建了一个优化后的Web API——最终的成功时刻!

总结

恭喜!你已经学会了用FastAPI实现响应压缩和缓存。回顾一下:

  • 压缩:用GZipMiddleware减小数据大小,类比打包压缩。
  • 缓存:用字典简单模拟存储响应,类比记忆常用信息。

这只是一个开始,FastAPI还有很多强大功能等待探索。通过动手实践,你已经建立了Web开发的信心。保持练习,继续构建更多有趣的应用!

扩展练习:尝试添加更多路径,或者使用FastAPI的文档功能(访问 http://localhost:8000/docs 自动生成API文档)。如果你遇到问题,查阅FastAPI官方文档获取帮助。

祝编码愉快!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包