FastAPI 教程

3.6 模型继承与重用

面向Python初学者的FastAPI快速入门教程

FastAPI 教程

为有基础Python知识的初学者准备的FastAPI入门教程,详细讲解从安装到创建API的步骤,包含生活化类比和动手实践示例,帮助快速上手Web开发并建立信心。

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

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

了解更多

FastAPI初学者入门教程:从零开始构建你的第一个API

欢迎来到FastAPI的世界!

如果你已经学会了Python的基础语法,比如变量、函数和列表,但现在想尝试点新东西——比如创建一个网站或App的后端服务,那么FastAPI就是你的完美起点。它就像快餐店一样,快速、简单、美味,让你快速尝到Web开发的甜头。

为什么选择FastAPI? 它易于学习,自动生成文档,并且速度快。最重要的是,它能让你在几分钟内看到成果,建立信心!


第一部分:准备和你的第一个“成功时刻”

步骤1:安装必备工具

假设你已经安装了Python(建议版本3.6以上)。打开你的终端或命令提示符,输入以下命令来安装FastAPI和运行它的服务器Uvicorn:

pip install fastapi uvicorn

这就像去超市买好做快餐的食材——简单快捷!

步骤2:创建你的第一个API文件

在你的电脑上创建一个新文件,命名为main.py(名字任意,但建议用这个)。用你喜欢的文本编辑器打开它,输入以下代码:

from fastapi import FastAPI

# 创建一个FastAPI应用实例,就像开一家新餐厅
app = FastAPI()

# 定义一个路由:当用户访问网站根目录时(比如http://127.0.0.1:8000/),执行这个函数
@app.get("/")
def read_root():
    return {"Hello": "World"}

解释一下@app.get("/") 是一个装饰器,告诉FastAPI:如果有人通过GET请求访问路径“/”,就运行下面的read_root函数。函数返回一个JSON对象,这就像餐厅的欢迎菜单。

步骤3:运行并看到成果

在终端中,导航到main.py所在的目录,输入:

uvicorn main:app --reload
  • main:app 指的是main.py文件中的app实例。
  • --reload 是开发模式,代码改变时自动重启,就像实时更新菜单。

现在,打开你的浏览器,访问 http://127.0.0.1:8000/。你会看到 {"Hello": "World"} 显示出来!这就是你的第一个成功时刻——你已经创建了一个Web API,并在浏览器中看到了它的输出。

小贴士:如果你看到错误,可能是端口被占用,可以试试 --port 8001 换一个端口。


第二部分:添加更多菜单项——理解路由和参数

在FastAPI中,路由就像餐厅的菜单项,每个路径对应一个不同的功能。让我们添加一个动态菜单项。

示例:处理带参数的请求

修改main.py,添加以下代码:

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

发生了什么? {item_id} 是一个路径参数,就像菜单上的可变选项。当用户访问 http://127.0.0.1:8000/items/42 时,FastAPI会自动将“42”转换为整数,并传递给item_id参数。

在浏览器中试试这个新路径:访问 http://127.0.0.1:8000/items/123,你会看到 {"item_id": 123}。又一个成功时刻!

类比:这就像顾客点餐时说“我要第42号菜品”,餐厅直接给你端上来。


第三部分:接收和验证数据——使用Pydantic模型

Web开发不只是返回数据,还要接收和处理数据。在FastAPI中,我们用Pydantic模型来定义数据格式,就像填写订单表单。

步骤1:定义一个模型

main.py顶部添加导入,然后定义一个模型:

from pydantic import BaseModel

# 定义一个Item模型,就像设计一张订单表格
class Item(BaseModel):
    name: str          # 必须字段:菜品名称,字符串类型
    price: float       # 必须字段:价格,浮点数类型
    is_offer: bool = False  # 可选字段:是否特价,默认False

为什么用模型? 它能自动验证输入数据。如果用户发送的数据不符合模型(比如价格是字符串),FastAPI会返回错误,省去你手动检查的麻烦。

步骤2:创建一个POST路由来接收数据

添加一个处理POST请求的路由:

@app.post("/items/")
def create_item(item: Item):
    # item参数会自动从请求体中解析,并验证是否符合Item模型
    return item  # 直接返回接收到的数据,作为确认

步骤3:测试你的API

运行应用后(如果还在运行,会自动重启),你需要一个工具来发送POST请求。推荐使用:

  • 浏览器扩展:如Postman或VS Code的REST Client。
  • 命令行:用curl,例如:
    curl -X POST "http://127.0.0.1:8000/items/" -H "Content-Type: application/json" -d '{"name":"Pizza","price":9.99}'
    

你会看到返回 {"name":"Pizza","price":9.99,"is_offer":false}。成功!你创建了一个能接收和返回数据的API。

成功时刻提示:访问 http://127.0.0.1:8000/docs,FastAPI自动生成了交互式文档!你可以在这里直接测试你的API,不用其他工具。


第四部分:模型继承与重用——进阶但简单

当你熟悉了基础模型后,可能会发现有些模型很相似。这时,可以用继承来重用代码,就像餐厅有基础套餐,可以加料升级。

示例:继承模型

假设你有一个基础菜品模型,然后想创建衣物和电子产品模型。修改main.py

# 基础模型,包含通用属性
class BaseItem(BaseModel):
    name: str
    description: str = None  # 可选描述,默认为None

# 衣物模型,继承BaseItem,添加特定属性
class ClothingItem(BaseItem):
    size: str  # 例如 "M", "L"

# 电子产品模型,同样继承BaseItem
class ElectronicsItem(BaseItem):
    warranty_years: int  # 保修年限

在路由中使用继承的模型

添加一些路由来测试:

@app.post("/clothing/")
def create_clothing(item: ClothingItem):
    return {"message": f"Clothing item '{item.name}' created with size {item.size}"}

@app.post("/electronics/")
def create_electronics(item: ElectronicsItem):
    return {"message": f"Electronics item '{item.name}' has {item.warranty_years} years warranty"}

试试看:使用文档页面或工具发送POST请求,比如:

  • 对于 /clothing/,发送 {"name":"T-Shirt", "size":"M"}
  • 对于 /electronics/,发送 {"name":"Laptop", "warranty_years":2}

你会看到相应的成功消息!这展示了如何通过继承减少重复代码,让API更模块化。


总结和下一步

恭喜!通过这个教程,你已经:

  1. 安装并运行了FastAPI,看到了第一个“Hello World”。
  2. 创建了动态路由,处理带参数的请求。
  3. 使用Pydantic模型 来验证和接收数据。
  4. 尝试了模型继承,重用代码构建更复杂的API。

所有这些都是在几分钟内完成的,没有复杂的理论,全是动手实践。FastAPI的强大之处在于它让Web开发变得简单有趣。

下一步建议

  • 探索更多功能,比如查询参数、错误处理。
  • 查看官方文档(https://fastapi.tiangolo.com/),那里有丰富示例。
  • 尝试构建一个小项目,比如待办事项列表API。

记住,Web开发就像学做菜:从简单的快餐开始,慢慢尝试新食谱。你已经迈出了第一步,继续加油!


有问题或反馈? 随时在社区或文档中查找帮助。享受编码的乐趣!

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

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

获取工具包