Flutter + FastAPI 30天速成计划自用并实践-第2天
早上上班前询问ai将第二天的主要内容重点整理下
问题如下:
学习下后端基础与数据核心 (FastAPI),帮我把第二天的学习内容主要说下
• Day 2 (数据模型):
○ 安装 pydantic。学习如何定义数据格式。
○ 任务: 定义一个 Article 模型(包含 id, title, content)。
学习点: Pydantic Model。
得到如下内容
Day 2: 数据模型 (Pydantic & Data Shapes)
目标:摆脱手动的 JSON 解析,学会使用 Pydantic 定义数据“长什么样”。这是 FastAPI 最强大的核心功能之一。
1. 核心概念:Pydantic
FastAPI 不像 Flask 那样需要你自己去解析 request.json()。你只需要定义一个 Python 类,FastAPI 会自动完成以下工作:
- 读取请求体:从 JSON 中读取数据。
- 数据校验:确保
id是数字,title是字符串。如果类型不对,自动报错。 - 自动文档:根据你的类,自动在
/docs页面生成交互式文档。
2. 准备工作
虽然安装 fastapi 时通常会自动安装 pydantic,但为了保险起见(以及后续可能用到特定功能):
pip install pydantic
3. 任务:定义 Article 模型
我们需要一个模型来代表你的“教程文章”。
代码实现 (main.py)
将以下代码添加到你的 main.py 中(或者覆盖昨天的练习代码):
from fastapi import FastAPI
from pydantic import BaseModel # 1. 导入 Pydantic 的基类
app = FastAPI()
# 2. 定义数据模型
# 这个类定义了前端必须发给你的数据格式
class Article(BaseModel):
id: int
title: str
content: str
# 可选:如果要定义可选字段,可以使用 Optional[str] = None
# 3. 创建一个接口使用这个模型
@app.post("/articles/")
async def create_article(article: Article):
# 这里的 article 参数已经是验证过的 Article 对象了
# 可以直接使用 article.title, article.content
# 模拟:我们只是把接收到的数据原样返回,证明解析成功
return {
"message": "文章接收成功",
"data": article
}
4. 验证与测试
不要写前端代码,直接使用 FastAPI 自带的文档工具测试。
运行服务:uvicorn main:app --reload
浏览器访问:http://127.0.0.1:8000/docs
找到 POST /articles/ 接口。
点击 Try it out。
在 Request body 中输入:
json
{
"id": 1,
"title": "学习 FastAPI 第2天",
"content": "我开始创建一个api接口。"
}
点击 Execute。
观察结果:
成功:返回状态码 200 和你发送的数据。
测试校验:试着把 “id”: 1 改成 “id”: “not-a-number”,再次发送。你会发现 FastAPI 自动返回 422 Unprocessable Entity 错误,告诉你是 id 字段类型错了。
5. 学习总结 (Key Takeaways)
Pydantic Model: 所有的请求体数据结构都应该继承自 BaseModel。
Type Hints: Python 的类型提示 (: int, : str) 在 FastAPI 中不仅仅是注释,它们决定了数据验证逻辑。
自动化: 定义好模型后,文档和验证全自动生成,无需手写 if not title: return error。
Next Step (Day 3): 数据存不住?明天我们将引入简单的数据库,把这些文章真正保存下来。
===========================================================
===========================================================
上班前
花上10分钟粗略看一遍,并安装了
pip install pydantic
上午抽空:
创建了main.py并执行了
uvicorn main:app --reload
打开http://127.0.0.1:8000/docs得到如下:No operations defined in spec!
提醒没有定义任何操作
检查发现少写了装饰符号@app.post(“/articles/”)
添加后正常了
然后点击 Try it out在post中输入
{
“id”: 1,
“title”: “学习 FastAPI 第2天”,
“content”: “今天我学会了安装环境和 Hello World。”
}
点击 Execute。
观察结果:
成功:返回状态码 200 和你发送的数据。
中午吃过饭
将id改成字符串而非数字会出现422
Error: Unprocessable Entity(错误:无法处理的实体)
同样,title和content也要符合定义必须是str,我测试了下""空的字符串也可以的
class Article(BaseModel):
id : int
title : str
content : str
测试下可选字段
class Article(BaseModel):
id : int
title : str
content : str
# 可选 : 如果要自定义可选字段,可以使用 Optional[str] = None
author : str = None
可以输入author字段,也可以不输入
好像只好给了初始值为None就会变成可选字段了我测试下将title和id赋值None
class Article(BaseModel):
id : int = None
title : str = None
content : str
# 可选 : 如果要自定义可选字段,可以使用 Optional[str] = None
author : str
确实可以不填写这个段字段。我搜错了下正规的写法应该在等号前面加上一个Optional[str]
修改后的代码如下:
class Article(BaseModel):
id : int
title : str
content : str
# 可选 : 如果要自定义可选字段,可以使用 Optional[str] = None
author : Optional[str] = None
如果没有赋值None就是必填字段,赋值None就是可选字段
但是报错NameError: name ‘Optional’ is not defined
解决方法是在最上面导入该模块,在typing中from typing import Optional
更多推荐


所有评论(0)