python的FastAPI 框架入门教程:从零构建完整 API 项目(含 Jinja2 模板引擎使用)

python的FastAPI 框架入门教程:从零构建完整 API 项目(含 Jinja2 模板引擎使用)
作为一名开发者,我相信你一定遇到过这样的场景:1.需要快速开发一个 API,但不想写一堆复杂的样板代码。2.文档和代码总是不同步,维护起来苦不堪言。3.性能要求很高,但又不想学习太复杂的异步编程。4.在 Python 中写 API,总感觉缺少类型安全保障。这些困扰,在我们刚开始接触 Web 开发时都经历过。直到我遇到了 FastAPI——一个现代、高性能的 Python Web 框架,它彻底改变了我对 API 开发的认知。

前言

fastapi,一个用于构建 API 的现代、快速(高性能)的web框架。基于 Python 3.6+ 的类型提示系统,自动生成交互式 API 文档,性能接近 Node.js 和 Go,学习曲线却非常平缓。更重要的是,它完美地解决了上述所有痛点。它出现的比较晚,2018年底才发布在github上。广泛应用于当前各种前后端分离的项目开发,测试运维自动化以及微服务的场景中。

在这篇教程中,我将带你从零开始,一步步构建一个完整的 FastAPI 项目,包含 API 接口开发和 HTML 页面渲染(使用 Jinja2 模板引擎)。通过这个项目,你将掌握 FastAPI 的核心用法,并理解为什么它是当前 Python API 开发的最佳选择之一。


在这里插入图片描述

一、FastAPI 核心优势

在开始代码实现之前,让我先分享一下 FastAPI 最吸引我的几个特性:

1. 极速性能

FastAPI 基于 Starlette(异步 Web 框架)和 Pydantic(数据验证库),性能可以与 Node.js 和 Go 并肩。官方测试显示,它的性能是 Flask 的 10-100 倍。

2. 自动文档生成

编写代码时,FastAPI 会自动根据类型提示生成交互式 API 文档。你不需要单独维护文档,代码就是文档——这完全解决了文档同步问题。

3. 类型安全

通过 Python 类型提示,FastAPI 自动验证请求和响应数据,减少了 40% 的人为错误。你再也不用写一堆 if 语句来验证用户输入了。

4. 异步支持

原生支持 async/await 语法,处理数据库操作、HTTP 请求等异步任务时非常简单,性能也更好。

5. 生产就绪

FastAPI 不是玩具框架——它已经在 Uber、Netflix、Microsoft 等大公司的生产环境中得到了验证。


二、环境准备

环境配置往往是新手学习新技术时的第一个障碍。我刚开始学 FastAPI 时,也踩了不少坑。下面是我总结的最简单、最可靠的配置方法。

2.1 Python 版本检查

首先,确保你的 Python 版本是 3.6 或更高。打开终端(Windows 用 CMD 或 PowerShell,Mac/Linux 用 Terminal),输入:

python --version# 或 python3 --version

技巧提示:我强烈建议使用 Python 3.7+,因为 FastAPI 的一些高级特性(如数据类)在 3.7 中更完善。

2.2 创建虚拟环境

为什么需要虚拟环境?想象一下:你同时在做两个项目,一个用 FastAPI 0.68,另一个用 0.95。如果没有虚拟环境,这两个版本的包会冲突,导致各种奇怪的问题。

# 使用 venv(Python 3.3+ 自带) python -m venv fastapi-env # 激活虚拟环境# Windows fastapi-env\Scripts\activate # Mac/Linuxsource fastapi-env/bin/activate 

激活后,你的命令行提示符前会出现 (fastapi-env),表示已经在虚拟环境中了。

2.3 安装依赖

在虚拟环境中,安装必要的包:

pip install fastapi uvicorn jinja2 

验证安装是否成功:

python -c"import fastapi; print(f'FastAPI 版本: {fastapi.__version__}')"

三、第一个 FastAPI 应用:Hello World

环境准备好了,让我们写第一个 API。我建议你跟着我一步步来,不要复制粘贴,亲手敲代码感受一下。

3.1 项目结构

创建一个新文件夹 fastapi-demo,然后在里面创建以下结构:

fastapi-demo/ ├── main.py # 主应用文件 └── templates/ # 模板文件夹 ├── index.html # 首页模板 ├── item_detail.html # 商品详情页模板 ├── base.html # 基础布局模板 └── error.html # 错误页面模板 

3.2 编写基础代码

打开 main.py,输入以下代码:

from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates app = FastAPI(title="产品展示系统", description="一个基于 FastAPI 的简单电商演示")# 配置 Jinja2 模板引擎 templates = Jinja2Templates(directory="templates")# 示例数据 ITEMS =[{"id":1,"name":"无人机","price":2999},{"id":2,"name":"智能手表","price":1599}]@app.get("/", response_class=HTMLResponse, name="首页")asyncdefread_root(request: Request):"""根路径的 GET 请求处理函数,返回产品列表页面"""return templates.TemplateResponse("index.html",{"request": request,"items": ITEMS})@app.get("/items/{item_id}", response_class=HTMLResponse, name="商品详情")asyncdefread_item(request: Request, item_id:int):""" 带路径参数的示例 参数: - item_id: 路径参数,自动转换为 int 类型 """ item =next((i for i in ITEMS if i["id"]== item_id),None)ifnot item:return templates.TemplateResponse("error.html",{"request": request,"error":"商品不存在"})return templates.TemplateResponse("item_detail.html",{"request": request,"item": item})if __name__ =="__main__":import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000,reload=True)

3.3 创建模板文件

templates 文件夹中创建以下模板文件:

base.html(基础布局)
<!DOCTYPEhtml><html><head><title>{% block title %}产品展示系统{% endblock %}</title><style>body{font-family:"Microsoft YaHei", Arial;max-width: 800px;margin: 0 auto;padding: 20px;}.item{border: 1px solid #ddd;padding: 15px;margin: 10px 0;border-radius: 8px;}.item:hover{box-shadow: 0 2px 10px rgba(0,0,0,0.1);}.price{color: #e74c3c;font-weight: bold;}.discount{color: #27ae60;font-size: 0.9em;}header h1{color: #3498db;border-bottom: 2px solid #3498db;padding-bottom: 10px;}footer{margin-top: 40px;text-align: center;color: #999;font-size: 0.9em;}</style></head><body><header><h1>产品展示系统</h1></header><main>{% block content %}{% endblock %}</main><footer>© 2024 FastAPI 商城</footer></body></html>
index.html(首页)
{% extends "base.html" %} {% block title %}产品列表{% endblock %} {% block content %} <h2>所有商品</h2><divclass="items"> {% for item in items %} <divclass="item"><h3>{{ item.name }}</h3><pclass="price">价格: ¥{{ item.price }}</p><ahref="/items/{{ item.id }}">查看详情</a></div> {% endfor %} </div> {% endblock %} 
item_detail.html(商品详情页)
{% extends "base.html" %} {% block title %}{{ item.name }} 详情{% endblock %} {% block content %} <divclass="item-detail"><h2>{{ item.name }}</h2><pclass="price">价格: ¥{{ item.price }}</p><p>产品ID: {{ item.id }}</p> {% if item.price > 2000 %} <pclass="discount">🔥 高端产品</p> {% endif %} </div> {% endblock %} 
error.html(错误页面)
{% extends "base.html" %} {% block title %}错误{% endblock %} {% block content %} <h2>错误信息</h2><p>{{ error }}</p> {% endblock %} 

3.4 启动项目

现在,你可以直接运行 main.py 文件来启动项目:

python main.py 

解释

  • uvicorn.run(app, host="127.0.0.1", port=8000, reload=True):启动 FastAPI 应用
  • reload=True:开发模式,代码修改后自动重启服务器

四、项目测试与文档查看

启动服务后,访问以下 URL 进行测试:

4.1 访问页面

  • 首页:http://127.0.0.1:8000/
  • 商品详情页:http://127.0.0.1:8000/items/1

4.2 查看自动生成的 API 文档

FastAPI 自动生成了两种格式的 API 文档:

  1. 交互式 API 文档 (Swagger UI)
    • 访问 http://127.0.0.1:8000/docs
    • 你可以在这里直接测试 API 接口
  2. ReDoc 文档
    • 访问 http://127.0.0.1:8000/redoc
    • 提供更简洁、更专业的文档视图

五、理解关键概念

现在,让我们深入理解 FastAPI 中的几个关键概念。

5.1 路由与路径参数

@app.get("/items/{item_id}")asyncdefread_item(request: Request, item_id:int):...
  • /items/{item_id}:路由定义,{item_id} 是路径参数
  • item_id: int:路径参数类型注解,FastAPI 会自动验证类型
  • 如果访问 /items/abc 这样的路径,FastAPI 会自动返回 422 错误

5.2 模板引擎与上下文传递

return templates.TemplateResponse("index.html",{"request": request,"items": ITEMS})
  • request:必须包含的参数,因为 Jinja2 模板需要它
  • items:传递给模板的数据,在模板中可以通过 {{ items }} 访问

5.3 响应类型注解

@app.get("/", response_class=HTMLResponse)
  • response_class=HTMLResponse:指定返回类型为 HTML
  • 这样,FastAPI 会自动设置正确的 Content-Type 响应头

六、生产环境部署建议

当你的代码准备好部署到生产环境时,有以下几点建议:

6.1 使用多进程运行

uvicorn main:app --host0.0.0.0 --port8000--workers4
  • --workers 4:根据 CPU 核心数设置工作进程数,一般是核心数的 2-4 倍

6.2 使用 Gunicorn 管理进程

pip install gunicorn gunicorn -w4-k uvicorn.workers.UvicornWorker main:app 

6.3 使用 Nginx 反向代理

server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 

七、项目扩展思路

现在你已经有了一个基础的项目,下面是一些扩展思路,可以让你的项目更加强大:

7.1 添加表单处理

from fastapi import Form @app.post("/items/create")asyncdefcreate_item( name:str= Form(...), price:float= Form(...)): new_id =max(i["id"]for i in ITEMS)+1 ITEMS.append({"id": new_id,"name": name,"price": price})return{"message":"商品创建成功"}

7.2 添加静态文件服务

from fastapi.staticfiles import StaticFiles app.mount("/static", StaticFiles(directory="static"), name="static")

7.3 添加数据库连接

可以使用 SQLAlchemy 或 Tortoise ORM 与数据库交互。

7.4 添加身份验证

可以使用 OAuth2 或 JWT 进行身份验证。


八、学习资源推荐

官方文档

示例项目

视频教程


总结

通过本教程,详细你已经从零开始搭建了一个完整的 FastAPI 项目,并使用 Jinja2 模板引擎生成了美观的 HTML 页面。并学会了如何使用自动生成的 API 文档来调试和测试。

FastAPI 的强大之处在于它的简单性和高性能。你只需要专注于业务逻辑,剩下的事情 FastAPI 都会帮你处理。强烈建议你在实际项目中尝试使用 FastAPI,相信它会给你带来全新的开发体验。如果你在学习过程中遇到任何问题,或者有任何建议,欢迎在评论区与我交流!


项目资源

参考链接

https://blog.ZEEKLOG.net/m0_46577795/article/details/155462743
https://www.cnblogs.com/banchengyanyu/p/18251156

Read more

前端老铁必看:Mock劫持Ajax翻车实录与避坑指南

前端老铁必看:Mock劫持Ajax翻车实录与避坑指南

前端老铁必看:Mock劫持Ajax翻车实录与避坑指南 * 前端老铁必看:Mock劫持Ajax翻车实录与避坑指南 * 咱就是说,这玩意儿到底咋忽悠浏览器的 * 核心原理:浏览器里的"替身演员" * 那fetch呢?它也跑不掉 * url、rtype、template这三个参数到底咋配合的 * 匹配优先级:谁说了算 * 扒开源码看底裤,拦截逻辑其实是这么玩的 * 源码级别的URL匹配骚操作 * 请求类型(rtype)的判断陷阱 * 数据生成引擎:template是怎么变成真实JSON的 * 延迟模拟:为什么要假装网络很慢 * 爽完之后的贤者时间:这招到底有啥毛病 * 性能陷阱:假数据太多,浏览器直接去世 * 类型安全地狱:TS项目里的Mock灾难 * 复杂业务逻辑模拟不了:鉴权、文件上传、流式数据 * 跨域和CORS的坑 * 真实搬砖场景:我在项目里是怎么靠它摸鱼的 * 场景一:后端接口延迟,先画UI * 场景二:模拟

By Ne0inhk
『AI辅助Skill』掌握三大AI设计Skill:前端独立完成产品设计全流程

『AI辅助Skill』掌握三大AI设计Skill:前端独立完成产品设计全流程

📣读完这篇文章里你能收获到 1. 🎨 掌握ASCII Design快速验证产品想法的方法 2. 🖼️ 学会Wireframe Design生成专业SVG线稿 3. 💻 了解三种Frontend Design Skills的选择策略 4. 🚀 掌握完整OPC工作流,1-2天完成产品开发 文章目录 * 前言 * 一、三大AI设计Skill工作流 * 1.1 传统流程的核心痛点 * 1.2 AI辅助工作流 * 二、ASCII与Wireframe设计技能 * 2.1 ASCII Design Skill —— 秒级验证产品想法 * 2.2 Wireframe Design Skill —— 专业级设计原型 * ASCII vs SVG:如何选择 * 核心特性 * 工作流程 * 三、Frontend Design Skills选择策略 * 3.1

By Ne0inhk
优选算法——双指针专题 3.快乐数 4.盛水最多的容器

优选算法——双指针专题 3.快乐数 4.盛水最多的容器

优选算法——双指针专题 3.快乐数 4.盛水最多的容器 一.快乐数 1.题目解析 [题目传送门](202. 快乐数 - 力扣(LeetCode)) 2.原理解析 第一种情况:数最后变成1 第二种情况:无限循环但不是1 但两种都可以抽象成一种,有点像之前做过的带环链表 解法:快慢双指针 1.定义快慢指针 2.慢指针每次向后移动一步,快指针每次向后移动两步 3.判断相遇时候的值 3.代码实现 classSolution{public:intBitSum(int n)//返回每一位数上的平方和{int sum=0;while(n){int m=n%10;

By Ne0inhk
《算法闯关指南:优选算法--模拟》--43.数青蛙

《算法闯关指南:优选算法--模拟》--43.数青蛙

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 43. 数青蛙 * 解法(模拟+分情况讨论): * 算法思路: * C++算法代码: * 算法总结&&笔记展示: * 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。 43. 数青蛙

By Ne0inhk