AgentSkillsCN

fastapi-helper

FastAPI开发助手,助力构建现代化的Python Web API。提供路由设计、请求与响应处理、依赖注入、身份认证、中间件、WebSocket、测试以及Pydantic模型等方面的指导。适用场景如下:(1) 创建FastAPI应用或API端点;(2) 实现CRUD操作;(3) 配置身份认证与权限管理;(4) 处理请求参数(路径参数、查询参数、请求体、请求头、Cookie、表单、文件);(5) 配置中间件或CORS;(6) 实现WebSocket连接;(7) 为FastAPI应用编写测试用例;(8) 定义Pydantic模型以进行数据校验。

SKILL.md
--- frontmatter
name: fastapi-helper
description: |
  FastAPI development assistant for building modern Python web APIs. Provides guidance on routing, request/response handling, dependency injection, authentication, middleware, WebSockets, testing, and Pydantic models. Use when: (1) Creating FastAPI applications or endpoints, (2) Implementing CRUD operations, (3) Setting up authentication/authorization, (4) Working with request parameters (path, query, body, headers, cookies, forms, files), (5) Configuring middleware or CORS, (6) Implementing WebSocket connections, (7) Writing tests for FastAPI apps, (8) Defining Pydantic models for validation.

FastAPI Helper

Build modern, high-performance Python APIs with FastAPI.

Quick Start

python
from fastapi import FastAPI

app = FastAPI()

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

Run: uvicorn main:app --reload

Core Concepts

Route Decorators

DecoratorHTTP Method
@app.get()GET
@app.post()POST
@app.put()PUT
@app.delete()DELETE
@app.patch()PATCH

Parameter Functions

FunctionSource
Path()URL path /items/{id}
Query()Query string ?q=foo
Body()JSON body
Header()HTTP headers
Cookie()Cookies
Form()Form data
File() / UploadFileFile uploads

Dependency Injection

python
from fastapi import Depends

async def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/items/")
async def read_items(db: Session = Depends(get_db)):
    return db.query(Item).all()

Common Imports

python
from fastapi import (
    FastAPI, APIRouter, Depends, HTTPException, status,
    Request, Response, BackgroundTasks, WebSocket,
    Path, Query, Body, Header, Cookie, Form, File, UploadFile
)
from fastapi.responses import JSONResponse, HTMLResponse, FileResponse, RedirectResponse
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field, EmailStr

Reference Documentation

Load these based on task:

TaskReference File
Routes, APIRouter, decoratorsreferences/routing.md
Path, Query, Body, Form, File paramsreferences/parameters.md
Response types, status codes, headersreferences/responses.md
Depends, Security, OAuth2references/dependencies.md
Middleware, CORS, lifespan, BackgroundTasksreferences/middleware-events.md
WebSocket connectionsreferences/websockets.md
HTTPException, error handlersreferences/exceptions.md
Pydantic models, validationreferences/pydantic-models.md
TestClient, pytest fixturesreferences/testing.md

Common Patterns

CRUD Endpoint Structure

python
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session

router = APIRouter(prefix="/items", tags=["items"])

@router.get("/", response_model=list[ItemOut])
async def list_items(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    return db.query(Item).offset(skip).limit(limit).all()

@router.get("/{item_id}", response_model=ItemOut)
async def get_item(item_id: int, db: Session = Depends(get_db)):
    item = db.query(Item).filter(Item.id == item_id).first()
    if not item:
        raise HTTPException(status_code=404, detail="Item not found")
    return item

@router.post("/", response_model=ItemOut, status_code=status.HTTP_201_CREATED)
async def create_item(item: ItemCreate, db: Session = Depends(get_db)):
    db_item = Item(**item.model_dump())
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

@router.put("/{item_id}", response_model=ItemOut)
async def update_item(item_id: int, item: ItemUpdate, db: Session = Depends(get_db)):
    db_item = db.query(Item).filter(Item.id == item_id).first()
    if not db_item:
        raise HTTPException(status_code=404, detail="Item not found")
    for key, value in item.model_dump(exclude_unset=True).items():
        setattr(db_item, key, value)
    db.commit()
    return db_item

@router.delete("/{item_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_item(item_id: int, db: Session = Depends(get_db)):
    db_item = db.query(Item).filter(Item.id == item_id).first()
    if not db_item:
        raise HTTPException(status_code=404, detail="Item not found")
    db.delete(db_item)
    db.commit()

CORS Setup

python
from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:3000"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

JWT Authentication Pattern

python
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
    user = decode_token(token)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return user

@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
    return current_user