FastAPI(一)初步使用

本教程介绍了 FastAPI 的基本使用,包括接口定义、数据模型、数据校验、依赖注入、中间件及接口文档。通过示例代码,展示了如何快速构建高性能 API 服务,适用于入门学习和实际开发。

GitHub:https://github.com/fastapi/fastapi
Document:https://fastapi.tiangolo.com/

conda create -n fastapi-env python=3.10
conda activate fastapi-env
pip install uvicorn fastapi requests python-multipart

1. 基本流程

from fastapi import FastAPI
import uvicorn

# 1. 创建 FastAPI 应用
app = FastAPI()

# 2. 定义接口函数
@app.get('/demo')
def demo():
    return {'result': 100}

# 3. 使用 uvicorn 启动 FastAPI 应用
if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

2. 请求方法

方法语义典型场景是否改数据
GET查询 / 获取查询列表、详情❌只读
POST新建注册、新增订单✅新增数据
PUT全量更新完整替换一条记录✅修改
PATCH局部更新只改个别字段✅修改
DELETE删除删除用户、删除订单✅删除

2.1 GET

from fastapi import FastAPI
import uvicorn

app = FastAPI()

# 1. 路径参数
@app.get('/get_path/{uid}')
def get_path(uid):
    print('查询用户', uid, '的用户')
    return {'status': 'success'}


# 2. 查询参数
@app.get('/get_query')
def get_query(gender : str):
    print('查询性别为', gender, '的所有用户!')
    return {'status': 'success'}


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

2.2 POST

from fastapi import FastAPI
from pydantic import BaseModel
from fastapi import Form
import uvicorn

app = FastAPI()

# 1. 表单
@app.post('/post_data/')
def post_data(name : str = Form(), age : int = Form(), gender : str = Form()):
    print(name, age, gender)
    return {'status': 'success'}


# 2. json
class User(BaseModel):
    name: str
    age: int
    gender: str

@app.post('/post_json/')
def post_json(user : User):
    print(user)
    return {'status': 'success'}


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

2.3 PUT

from fastapi import FastAPI
from pydantic import BaseModel
from fastapi import Form
import uvicorn

app = FastAPI()


class User(BaseModel):
    name: str
    age: int
    gender: str


@app.put('/put/{uid}')
def put(uid : int, user: User):
    print(uid, user)
    return {'status': 'success'}


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

2.4 PATCH

from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn

app = FastAPI()

class User(BaseModel):
    name: str | None = None
    age: int | None = None
    gender: str | None = None


@app.patch("/patch/{uid}")
def patch(uid : int, data: User):
    print(uid, data.model_dump(exclude_unset=True))
    return {"status":"ok"}


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

2.5 DELETE

from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.delete("/delete/{uid}")
def delete(uid : int):
    print('删除用户 ', uid, '的数据!')
    return {"status":"ok"}


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

3. 异步任务

在 FastAPI 中定义接口时,我们经常会看到两种写法:

import time
import asyncio
from fastapi import FastAPI
import uvicorn


app = FastAPI()


@app.get('/get_normal/')
def get_normal(uid):
    time.sleep(10)
    return {'status': 'success'}


@app.get('/get_async/')
async def get_async(uid):
    await asyncio.sleep(10)
    return {'status': 'success'}


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

二者最核心的区别在于:def 接口通常由线程池中的工作线程执行,而 async def 接口通常由事件循环调度执行。