fastapi,一个飞快的 Python Web 库!

文摘   2024-12-19 00:10   河南  

FastAPI:超快速的现代 Python Web 框架!

大家好!今天我要介绍一个特别炫酷的 Python Web 框架 -FastAPI!它不仅速度超快(和 Node.js、Go 相当),而且开发体验一级棒!FastAPI 基于 Python 3.6+ 的类型提示功能,能自动生成 API 文档,还内置了数据验证功能。如果你想开发高性能的 API 服务,FastAPI 绝对是你的不二之选!

1. 快速入门

首先安装 FastAPI 和 ASGI 服务器:

# 安装所需包
pip install fastapi uvicorn

# 创建第一个API
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message""Hello FastAPI!"}

# 运行服务器: uvicorn main:app --reload

小贴士: FastAPI 默认支持异步编程!使用async def 定义异步路由处理函数,性能会更好。但如果你不熟悉异步编程,使用普通的def 也完全没问题。

2. 路径参数和查询参数

FastAPI 的参数处理非常优雅:

from fastapi import FastAPI
from typing import Optional

app = FastAPI()

# 路径参数
@app.get("/users/{user_id}")
asyncdef read_user(user_id: int):
    return {"user_id": user_id}

# 查询参数
@app.get("/items/")
asyncdef read_items(skip: int = 0, limit: int = 10, q: Optional[str] = None):
    items = [{"id": i} for i in range(skip, skip + limit)]
    if q:
        items.append({"search": q})
    return items

重要提示: 注意类型注解的使用!FastAPI 会:

  • 自动验证参数类型
  • 自动转换数据类型
  • 在 API 文档中显示参数类型

3. 请求体和数据模型

使用 Pydantic 模型进行数据验证:

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

class Item(BaseModel):
    name: str
    price: float
    description: Optional[str] = None
    tags: List[str] = []

app = FastAPI()

@app.post("/items/")
asyncdef create_item(item: Item):
    return item

@app.put("/items/{item_id}")
asyncdef update_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

小贴士: Pydantic 模型不仅可以验证数据,还能自动生成 OpenAPI(Swagger)文档!访问/docs 就能看到漂亮的 API 文档。

4. 实战示例:待办事项 API

让我们创建一个完整的待办事项 API:

from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime

app = FastAPI()

# 数据模型
class TodoBase(BaseModel):
    title: str
    description: Optional[str] = None
    priority: int = 1

class TodoCreate(TodoBase):
    pass

class Todo(TodoBase):
    id: int
    created_at: datetime
    done: bool = False

    class Config:
        orm_mode = True

# 模拟数据库
todos = []
todo_id_counter = 1

# API endpoints
@app.post("/todos/", response_model=Todo, status_code=status.HTTP_201_CREATED)
asyncdef create_todo(todo: TodoCreate):
    global todo_id_counter
    new_todo = Todo(
        id=todo_id_counter,
        created_at=datetime.now(),
        **todo.dict()
    )
    todos.append(new_todo)
    todo_id_counter += 1
    return new_todo

@app.get("/todos/", response_model=List[Todo])
asyncdef list_todos(skip: int = 0, limit: int = 10):
    return todos[skip : skip + limit]

@app.get("/todos/{todo_id}", response_model=Todo)
asyncdef get_todo(todo_id: int):
    for todo in todos:
        if todo.id == todo_id:
            return todo
    raise HTTPException(status_code=404, detail="Todo not found")

@app.put("/todos/{todo_id}/toggle", response_model=Todo)
asyncdef toggle_todo(todo_id: int):
    for todo in todos:
        if todo.id == todo_id:
            todo.done = not todo.done
            return todo
    raise HTTPException(status_code=404, detail="Todo not found")

@app.delete("/todos/{todo_id}", status_code=status.HTTP_204_NO_CONTENT)
asyncdef delete_todo(todo_id: int):
    for i, todo in enumerate(todos):
        if todo.id == todo_id:
            todos.pop(i)
            return
    raise HTTPException(status_code=404, detail="Todo not found")

小贴士: FastAPI 的错误处理非常优雅,使用HTTPException 可以轻松返回正确的 HTTP 状态码和错误信息。

5. 中间件和依赖注入

FastAPI 支持中间件和依赖注入系统:

from fastapi import FastAPI, Depends, Header
from typing import Optional

app = FastAPI()

# 中间件示例
@app.middleware("http")
asyncdef add_response_header(request, call_next):
    response = await call_next(request)
    response.headers["X-Custom-Header"] = "Custom Value"
    return response

# 依赖注入示例
asyncdef get_token_header(x_token: Optional[str] = Header(None)):
    ifnot x_token:
        raise HTTPException(status_code=400, detail="X-Token header missing")
    return x_token

@app.get("/protected-route/")
asyncdef protected_route(token: str = Depends(get_token_header)):
    return {"token": token}

今天的 Python 学习之旅就到这里啦!记得动手敲代码,可以尝试以下练习:

  • 给待办事项 API 添加用户认证
  • 实现待办事项的优先级排序
  • 添加截止日期功能
  • 集成数据库(如 SQLAlchemy)
  • 添加任务标签功能

祝大家学习愉快,Python学习节节高!


水晶的世界观
所有的努力,都将转化为成果。
 最新文章