FastAPI初识
手把手教你用 FastAPI 写出第一个 API
开篇废话
嘿,朋友!最近想写个简单的 API 后端,又不想被 Django 那一大堆配置吓到,对吧?我也是。后来发现 FastAPI 这玩意儿,真的是用起来像跟朋友聊天一样自然。你写过 Flask 的话会更亲切,没写过也没事,今天咱们从零开始,用最土的话把 FastAPI 搞定。
FastAPI 是什么?
一个字:快。不光是运行快,写起来也快。它自动帮你生成漂亮的 API 文档(Swagger UI)、验证数据类型、还自带异步支持。说白了,就是 Python 里面写 RESTful API 最爽的框架,没有之一。
装它!
打开终端,敲一行:
pip install fastapi uvicorn
uvicorn 是个 ASGI 服务器,用来跑 FastAPI。你也可以用 hypercorn,不过 uvicorn 是亲儿子,稳。
第一个接口:Hello World
新建一个 main.py,写进下面这些:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, 朋友!"}
然后在终端运行:
uvicorn main:app --reload
打开浏览器访问 http://127.0.0.1:8000,你会看到 JSON 返回。就这么简单?就这么简单。
请求参数:GET 和 POST
很多时候我们需要让用户传点东西过来。比如你想写个根据名字打招呼的接口:
@app.get("/greet")
def greet(name: str):
return {"hello": f"{name},吃了没?"}
访问 http://127.0.0.1:8000/greet?name=王二狗 就会返回 {"hello": "王二狗,吃了没?"}。
如果你不想用查询参数,想从路径里取,像这样:
@app.get("/greet/{name}")
def greet_path(name: str):
return {"hello": f"{name},你好啊"}
看习惯选哪种都行。
POST 请求一般用来创建数据。我们来个简单的:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
@app.post("/items")
def create_item(item: Item):
return {"received": item.name, "price": item.price}
pydantic 是 FastAPI 的默契搭档。你只需要定义好数据模型,FastAPI 会自动帮你校验请求体是不是符合要求。比如传个 {"name": "西瓜", "price": 3.5},它就能干。如果你传 price: "三元",它会直接报 422 错误,省得你写一堆 if 判断。
查询参数和可选参数
有时候参数不是必须的。比如你想加个 verbose 开关:
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None, verbose: bool = False):
result = {"item_id": item_id}
if q:
result["q"] = q
if verbose:
result["verbose_info"] = "你开启了详细模式"
return result
q: str = None 表示可选,verbose: bool = False 表示默认是 False。
自动生成的文档
这是 FastAPI 最牛的地方:你啥都没干,它就已经给你生成了两个文档地址。
http://127.0.0.1:8000/docs→ Swagger UI,可视化测试http://127.0.0.1:8000/redoc→ ReDoc,另一种风格
你可以在页面里直接点击“Try it out”,填参数,发请求,看返回。爽不爽?
错误处理:别让用户一脸懵
有时候客户端传了非法数据,你可以自己定义返回错误信息:
from fastapi import HTTPException
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id <= 0:
raise HTTPException(status_code=400, detail="item_id 必须大于0!")
return {"item_id": item_id}
依赖注入:省事又优雅
比如你需要一个通用的数据库连接、或者认证校验。写个函数,然后用 Depends:
from fastapi import Depends
def verify_token(token: str = None):
if token != "secret":
raise HTTPException(status_code=401, detail="Token 不对")
return True
@app.get("/secure-data")
def secure_data(auth: bool = Depends(verify_token)):
return {"data": "只有你知道的秘密"}
这样的话,你可以在很多接口里复用这个 verify_token,不用重复写。
小总结
写了这么多,其实 FastAPI 的核心就这几条:
- 定义路由:
@app.get/post/put/delete - 用 Pydantic 模型自动校验请求体
- 类型注解让 IDE 更聪明
- 自动文档省去了写文档的麻烦
- 依赖注入让代码更干净
你可能会觉得我漏了很多东西:数据库、用户认证、CORS……没错,那都是实际项目才需要的。今天这篇只是让你尝尝 FastAPI 到底多简单。更多功能可以去官网看,它文档写得贼好,而且全是例子。
最后的话
如果你照着上面试了,发现一遍就能跑起来,那说明你悟性不错。如果报错了,别慌,检查一下 pip list 里有没有安装 fastapi 和 uvicorn,或者看看终端是不是没关之前的进程。编程嘛,就是不断踩坑然后填坑。
好了,教程就到这里。写的随性,但全是真话。如果你觉得有用,给我点个赞(心里那种就行)。
本文采用 CC BY-NC-SA 4.0 许可协议,转载请标明出处
