FastAPI初识

手把手教你用 FastAPI 写出第一个 API

发布于 作者 Shifenmiao更新于 技术0

开篇废话

嘿,朋友!最近想写个简单的 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 许可协议,转载请标明出处

评论0 条评论

还没有评论,来抢沙发。

发表评论

选填,不会公开

最多 1000 字