Python FastAPI入门指南

46 阅读6分钟

什么是FastAPI?为什么它这么火?

最近在Python圈子里,有一个框架火得不行,那就是FastAPI**。说实话,我第一次听到这个名字的时候,还以为是某个快餐店的新品牌呢!但接触之后,我发现这个框架简直是API开发的神器。

FastAPI是一个用于构建API的现代、快速的Web框架,基于Python 3.6+的类型提示。它的创造者是Sebastian Ramirez,这哥们儿真是个天才,把API开发变得像写普通Python代码一样简单。

为什么说FastAPI厉害呢?首先,它的性能超级棒,可以和Node.js、Go这些语言的框架媲美。其次,它的文档是自动生成的,你写完代码,文档就自动出来了,这对我这种懒人来说简直是福音!

安装FastAPI,开始我们的API之旅

在开始写代码之前,我们需要先安装FastAPI。这里有个小坑,FastAPI本身只是个框架,要让它跑起来,还需要一个服务器,推荐使用uvicorn。

打开你的命令行,输入以下命令:

pip install fastapi uvicorn

如果你用的是conda**环境,也可以这样安装:

conda install -c conda-forge fastapi uvicorn

安装完成后,我们就可以开始写我们的第一个API了!

案例一:Hello World API - 我的第一个FastAPI应用

让我们从最简单的例子开始。我要创建一个最基础的API,就像编程界的"Hello World"一样。

from fastapi import FastAPI

# 创建FastAPI应用实例
app = FastAPI()

# 定义一个GET接口
@app.get("/")
def read_root():
    return {"message""Hello World"}

# 定义一个带参数的接口
@app.get("/hello/{name}")
def say_hello(name: str):
    return {"message"f"Hello {name}!"}

把这段代码保存为main.py,然后在命令行中运行:

uvicorn main:app --reload

这时候,你的电脑就变成了一个API服务器!打开浏览器,访问http://127.0.0.1:8000,你就能看到{"message": "Hello World"}这个响应了。

更神奇的是,访问http://127.0.0.1:8000/docs,你会看到一个自动生成的API文档界面,可以直接在网页上测试你的API。这就是我说的自动文档功能,是不是很酷?

案例二:用户管理API - 处理POST请求和数据验证

光能返回Hello World可不够用,我们来做个稍微复杂点的例子:一个用户管理的API。这个例子会展示如何处理POST请求,以及FastAPI强大的数据验证功能。

首先,我们需要定义数据模型。FastAPI使用Pydantic来做数据验证,这个库超级好用:

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

app = FastAPI()

# 定义用户数据模型
class User(BaseModel):
    name: str
    age: int
    email: Optional[str] = None
    is_active: boolTrue

# 模拟数据库(实际项目中你会用真正的数据库)
fake_users_db = []

@app.post("/users/")
def create_user(user: User):
    # 给用户分配一个ID
    user_dict = user.dict()
    user_dict["id"] = len(fake_users_db) + 1
    fake_users_db.append(user_dict)
    return {"message""用户创建成功""user": user_dict}

@app.get("/users/")
def get_users():
    return {"users": fake_users_db}

@app.get("/users/{user_id}")
def get_user(user_id: int):
    for user in fake_users_db:
        if user["id"] == user_id:
            return {"user": user}
    return {"error""用户不存在"}

这个例子展示了几个重要概念:

  1. 数据模型:我用User类定义了用户的数据结构
  2. 类型提示:FastAPI会自动验证数据类型
  3. 可选字段email字段是可选的,有默认值
  4. 路径参数{user_id}会自动提取URL**中的参数

现在你可以用POST方法往/users/发送数据来创建用户,FastAPI会自动验证数据格式是否正确。

案例三:天气查询API - 集成第三方服务

让我们做一个更实用的例子:一个天气查询API。这个例子会展示如何在FastAPI中调用第三方服务。

首先安装requests库:

pip install requests

然后写代码:

from fastapi import FastAPI, HTTPException
import requests
from pydantic import BaseModel

app = FastAPI()

class WeatherResponse(BaseModel):
    city: str
    temperature: float
    description: str
    humidity: int

@app.get("/weather/{city}", response_model=WeatherResponse)
def get_weather(city: str):
    # 这里用的是免费的天气API(实际使用时你需要申请API key)
    api_key = "your_api_key_here"
    url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
    
    try:
        response = requests.get(url)
        response.raise_for_status()
        data = response.json()
        
        weather_info = WeatherResponse(
            city=data["name"],
            temperature=data["main"]["temp"],
            description=data["weather"][0]["description"],
            humidity=data["main"]["humidity"]
        )
        return weather_info
        
    except requests.exceptions.RequestException:
        raise HTTPException(status_code=500, detail="无法获取天气信息")
    except KeyError:
        raise HTTPException(status_code=404, detail="城市不存在")

# 健康检查接口
@app.get("/health")
def health_check():
    return {"status""API运行正常"}

这个例子展示了:

  1. 错误处理:使用HTTPException返回合适的错误状态码
  2. 响应模型:用response_model参数指定返回数据的格式
  3. 第三方API集成:调用外部天气服务
  4. 健康检查:这在生产环境中很重要

FastAPI的超能力:自动文档和类型安全

我最喜欢FastAPI的两个特性就是自动文档生成和类型安全。

当你运行FastAPI应用后,访问/docs就能看到Swagger UI风格的API文档,访问/redoc能看到ReDoc**风格的文档。这些文档都是根据你的代码自动生成的,包括请求参数、响应格式、错误码等等。

类型安全也是FastAPI的一大亮点。因为使用了Python的类型提示,FastAPI能在运行时自动验证数据,如果客户端发送的数据格式不对,会自动返回详细的错误信息。

部署你的FastAPI应用

开发完成后,你肯定想把应用部署到服务器上让别人使用。FastAPI应用的部署很简单,最常见的方式是使用Docker:

FROM python:3.9

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

或者直接用uvicorn启动:

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

我的FastAPI学习心得

学习FastAPI的过程中,我发现它真的把API开发变得简单了很多。以前用Flask写API,我需要手动写文档,手动做数据验证,现在这些都自动化了。

如果你是Python新手,我建议你:

  1. 先把Python基础学扎实,特别是类型提示
  2. 了解一下HTTP协议的基本知识
  3. 从简单的例子开始,逐步增加复杂度

FastAPI的学习曲线相对平缓,文档也写得很好,官网有很多例子可以参考。最重要的是,多动手练习,理论再好也不如写代码来得实在。

总的来说,FastAPI是一个既现代又实用的框架,它让我重新爱上了API开发。如果你还在犹豫要不要学习FastAPI,我的建议是:别犹豫了,开始动手吧!

参考:mp.weixin.qq.com/s/usVCQvPUU…