3.6 模型继承与重用
面向Python初学者的FastAPI快速入门教程
为有基础Python知识的初学者准备的FastAPI入门教程,详细讲解从安装到创建API的步骤,包含生活化类比和动手实践示例,帮助快速上手Web开发并建立信心。
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更模块化。
总结和下一步
恭喜!通过这个教程,你已经:
- 安装并运行了FastAPI,看到了第一个“Hello World”。
- 创建了动态路由,处理带参数的请求。
- 使用Pydantic模型 来验证和接收数据。
- 尝试了模型继承,重用代码构建更复杂的API。
所有这些都是在几分钟内完成的,没有复杂的理论,全是动手实践。FastAPI的强大之处在于它让Web开发变得简单有趣。
下一步建议:
- 探索更多功能,比如查询参数、错误处理。
- 查看官方文档(https://fastapi.tiangolo.com/),那里有丰富示例。
- 尝试构建一个小项目,比如待办事项列表API。
记住,Web开发就像学做菜:从简单的快餐开始,慢慢尝试新食谱。你已经迈出了第一步,继续加油!
有问题或反馈? 随时在社区或文档中查找帮助。享受编码的乐趣!