К основному содержанию
правило

fastapi · sanjeed5 — правило для Cursor: что делает и как установить

Задаёт стандарты разработки на FastAPI: доменную структуру файлов, валидацию через Pydantic и асинхронные зависимости.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/fastapi.mdc
Открыть на GitHub

Что делает fastapi

Правило настраивает Cursor под архитектуру FastAPI для файлов **/*.py. Оно требует разбивать код по доменам (auth, users) с отдельными файлами роутеров, схем и сервисов вместо общей свалки в одном каталоге. Роутеры остаются тонкими. Вся бизнес-логика выносится в слой service.py.

В коде предписывается строгая типизация аргументов и моделей ответов через Pydantic. Сессии базы данных и аутентификация передаются исключительно через fastapi.Depends. Для ошибок правило запрещает бросать базовый ValueError, требуя явный HTTPException со статусом ответа.

Блокирующие операции в асинхронных функциях замораживают цикл событий. Для вычислений на процессоре правило требует вызывать run_in_threadpool, а для базы брать асинхронные драйверы. Конфигурация с секретами хранится строго в .env через класс BaseSettings.

Какие задачи решает

  • организовать структуру проекта FastAPI по предметным доменам
  • настроить передачу сессий базы данных через fastapi.Depends
  • вынести бизнес-логику из контроллеров в сервисный слой
  • изолировать блокирующие CPU-операции через run_in_threadpool
  • перевести конфигурацию проекта на pydantic-settings

Примеры запросов агенту

  • Создай роутер для регистрации пользователей с валидацией через Pydantic
  • Вынеси работу с базой данных в отдельный сервис с внедрением зависимостей
  • Добавь эндпоинт для ресурсоёмкой задачи без блокировки event loop

Как установить fastapi

Вручную: положить файлы

.cursor/rules/fastapi.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о fastapi

Как установить правило fastapi в Cursor?

Сохраните файл правила по пути .cursor/rules/fastapi.mdc в корне вашего проекта. После этого Cursor начнёт применять инструкции ко всем файлам с расширением .py.

Зачем нужно правило fastapi?

Оно удерживает ИИ-ассистента в рамках практик FastAPI: заставляет использовать Pydantic, делить проект на домены и внедрять зависимости через Depends.

Как по правилу обрабатывать тяжёлые CPU-задачи?

Правило запрещает блокировать асинхронный цикл и предписывает передавать синхронные вычисления в функцию run_in_threadpool.

Исходный текст

fastapi.mdc · CC0-1.0
---
description: Definitive guidelines for building high-performance, maintainable, and secure FastAPI applications using modern Python best practices.
globs: **/*.py
---
# FastAPI Best Practices

FastAPI is the go-to for high-performance Python APIs. This guide ensures your projects are scalable, secure, and maintainable from day one.

## 1. Code Organization: Domain-Driven Modularity

For any project beyond a few endpoints, organize by domain functionality, not file type. This improves scalability and team collaboration.

❌ BAD: Single `main.py` or `routers/`, `schemas/` directories with all domains mixed.
```python
# app/routers/users.py
# app/routers/items.py
# app/schemas/user.py
# app/schemas/item.py
```

✅ GOOD: Group related components by domain.
```
src/
├── auth/
│   ├── router.py
│   ├── schemas.py
│   ├── service.py # Business logic
│   └── dependencies.py
├── users/
│   ├── router.py
│   ├── schemas.py
│   ├── service.py
│   └── dependencies.py
├── core/
│   ├── config.py # Pydantic BaseSettings
│   └── security.py
├── db/
│   ├── session.py # SQLAlchemy engine/session
│   └── base.py    # Base for models
├── main.py        # Entry point
└── __init__.py
```

## 2. Type Hints: Mandatory Everywhere

Leverage Python's type hints and Pydantic for robust data validation, auto-documentation, and IDE support.

❌ BAD: Missing or inconsistent type hints.
```python
@app.post("/items/")
def create_item(item: dict): # No Pydantic model
    return item
```

✅ GOOD: Explicit Pydantic models and type hints for all function signatures.
```python
from pydantic import BaseModel
from fastapi import FastAPI

class ItemCreate(BaseModel):
    name: str
    description: str | None = None
    price: float

app = FastAPI()

@app.post("/items/", response_model=ItemCreate)
async def create_item(item: ItemCreate) -> ItemCreate:
    # Logic to save item
    return item
```

## 3. Dependency Injection: Decouple Components

Use `fastapi.Depends` for managing database sessions, authentication, and other shared resources. This makes code testable and modular.

❌ BAD: Global database session or direct instantiation.
```python
# In router.py
from app.db.session import SessionLocal
db = SessionLocal() # Global or directly called
```

✅ GOOD: Inject dependencies using `Depends`.
```python
from typing import Annotated
from fastapi import Depends
from sqlalchemy.ext.asyncio import AsyncSession
# Assume get_session and User are defined elsewhere
# from app.db.session import get_session
# from app.models.user import User

async def get_current_user(token: str) -> 'User': # 'User' for forward reference
    # ... auth logic
    return 'User'(id=1, username="test") # Placeholder

@app.get("/me/")
async def read_current_user(
    db: Annotated[AsyncSession, Depends(lambda: None)], # Placeholder for get_session
    current_user: Annotated['User', Depends(get_current_user)]
):
    return current_user
```

## 4. API Design: Versioning & Thin Endpoints

Version your API from day one. Keep router endpoints focused, delegating business logic to service layers.

❌ BAD: Unversioned API, fat endpoints with business logic.
```python
# app/main.py
@app.get("/users/{user_id}")
def get_user_details(user_id: int, db: 'Session'): # Placeholder
    user = None # db.query(User).filter(User.id == user_id).first()
    # Complex business logic here
    return user
```

✅ GOOD: Use `APIRouter` with prefixes and tags. Delegate logic to `service.py`.
```python
# src/users/router.py
from fastapi import APIRouter, Depends
# Assume get_session, User, UserOut, service are defined elsewhere
# from src.users import service, schemas
# from app.db.session import get_session

router = APIRouter(prefix="/v1/users", tags=["Users"])

@router.get("/{user_id}", response_model=None) # Placeholder for schemas.UserOut
async def read_user(user_id: int, db: 'AsyncSession' = Depends(lambda: None)): # Placeholder
    user = None # await service.get_user_by_id(db, user_id)
    return user

# src/users/service.py
async def get_user_by_id(db: 'AsyncSession', user_id: int) -> 'User': # Placeholder
    # Database query logic
    return None # await db.get(User, user_id)
```

## 5. Error Handling: Use `HTTPException`

Raise `HTTPException` for API-specific errors. Implement custom handlers for global error types.

❌ BAD: Raising generic Python exceptions.
```python
items_db = {1: {"name": "item1"}}
@app.get("/items/{item_id}")
async def get_item(item_id: int):
    if item_id not in items_db:
        raise ValueError("Item not found") # Returns 500
    return items_db[item_id]
```

✅ GOOD: Raise `HTTPException` with appropriate status codes.
```python
from fastapi import HTTPException, status

items_db = {1: {"name": "item1"}}
@app.get("/items/{item_id}")
async def get_item_good(item_id: int):
    if item_id not in items_db:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="Item not found"
        )
    return items_db[item_id]
```

## 6. Performance: Async-First & Production Deployment

Embrace `async`/`await` for I/O-bound operations. For CPU-bound tasks, use `run_in_threadpool`. Deploy with Gunicorn + Uvicorn.

❌ BAD: Blocking I/O in async endpoints.
```python
# In an async endpoint
import time
@app.get("/blocking")
async def blocking_endpoint():
    time.sleep(1) # Blocks the event loop
    return {"message": "Done blocking work"}
```

✅ GOOD: Use async libraries (e.g., `asyncpg`, `httpx[async]`) or `run_in_threadpool`.
```python
from fastapi import FastAPI
from fastapi.concurrency import run_in_threadpool
import time

app = FastAPI()

def cpu_bound_task():
    time.sleep(0.1) # Simulate CPU work
    return "Done CPU work"

@app.get("/cpu-work")
async def handle_cpu_work():
    result = await run_in_threadpool(cpu_bound_task)
    return {"message": result}

# Production deployment:
# gunicorn -k uvicorn.workers.UvicornWorker src.main:app --workers 4 --bind 0.0.0.0:8000
```

## 7. Security: Environment Variables & Auth

Store sensitive configuration in environment variables using `pydantic-settings`. Implement authentication via `Depends`.

❌ BAD: Hardcoded secrets or config.
```python
# app/core/config.py
DATABASE_URL = "postgresql://user:pass@host:port/db" # Bad
```

✅ GOOD: Use `pydantic-settings` for environment-based configuration.
```python
# src/core/config.py
from pydantic_settings import BaseSettings, SettingsConfigDict

class Settings(BaseSettings):
    DATABASE_URL: str
    SECRET_KEY: str
    ALGORITHM: str = "HS256"

    model_config = SettingsConfigDict(env_file=".env", extra="ignore")

settings = Settings()
```
```python
# .env (local development)
DATABASE_URL="postgresql+asyncpg://user:pass@db:5432/app"
SECRET_KEY="your-super-secret-key"
```
```python
# src/core/security.py
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_active_user(token: str = Depends(oauth2_scheme)):
    # Validate token and return user
    return {"username": "current_user"} # Placeholder
```

## 8. Logging: Structured & Centralized

Log to `stdout`/`stderr` in a structured format (e.g., JSON). Let your deployment environment handle aggregation.

❌ BAD: Writing logs to local files or unstructured print statements.
```python
print("User accessed /health endpoint")
```

✅ GOOD: Use Python's `logging` module with a structured formatter.
```python
import logging
# from pythonjsonlogger.jsonlogger import JsonFormatter # Install python-json-logger

LOGGING_CONFIG = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "json": {
            "()": "jsonlogger.JsonFormatter", # Use if python-json-logger is installed
            "format": "%(levelname)s %(asctime)s %(name)s %(message)s"
        }
    },
    "handlers": {
        "default": {
            "formatter": "json", # Change to "standard" if jsonlogger not installed
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout",
        },
    },
    "loggers": {
        "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
        "uvicorn.access": {"handlers": ["default"], "level": "INFO", "propagate": False},
        "app": {"handlers": ["default"], "level": "INFO", "propagate": False},
    },
    "root": {"handlers": ["default"], "level": "INFO"},
}

logger = logging.getLogger("app")

@app.get("/health")
async def health():
    logger.info("Health check called", extra={"endpoint": "/health"})
    return {"status": "ok"}
```

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Похожие правила IDE

Все правила IDE по теме «Бэкенд и API» →

Сначала — fastapi от других авторов.

fastapi PatrickJS Правило задаёт практики для FastAPI-проектов на Python: структура, API, модели, база данных, безопасность и тесты. Подключается к файлам по glob-шаблонам. ★ 41 028звёзд репо fastapi-expert https://github.com/Jeffallan Помогает разрабатывать асинхронные API на FastAPI с моделями Pydantic V2. Пригодится для маршрутов, аутентификации, работы с базой и тестов. CX Codex +1 6 100установок fastapi-python Mindrally Задаёт агенту стиль разработки на FastAPI: async, Pydantic v2, обработка ошибок и структура роутеров. Пригодится, когда пишете API на Python. CX Codex +1 13 900установок fastapi-patterns affaan-m Задаёт структуру продакшен-проекта на FastAPI, схему валидации Pydantic v2 и внедрение зависимостей. Пригодится при проектировании сервисов, настройке JWT-авторизации и подготовке тестов. CX Codex +1 4 900установок fastapi-development aj-geddes Скилл для ИИ-агента, который помогает писать Python-API на FastAPI: асинхронные роуты, валидация через Pydantic, JWT и автодокументация OpenAPI. CX Codex +1 618установок fastapi-pro davila7 Настраивает Claude Code на разработку асинхронных API на FastAPI с Pydantic V2. Пригодится при проектировании микросервисов и подготовке деплоя. 201установок python-312-fastapi-best-practices-cursorrules-prom PatrickJS Задаёт стек и правила разработки на FastAPI под Python 3.12. Направляет Cursor на использование Poetry, Alembic и готовых библиотек экосистемы FastAPI. ★ 41 028звёзд репо

Из того же набора240

Весь набор →
flake8 Правило для Cursor задаёт, как настроить flake8 и какие проверки включить. Пригодится, если в проекте есть Python и хочется ловить стилевые ошибки и баги до коммита. ★ 3 580звёзд репо firebase Задаёт стандарты безопасности для Firebase в проекте. Помогает настроить App Check и закрыть доступ к базе через Security Rules. ★ 3 580звёзд репо fiber Правило Cursor для проектов на Fiber в Go: задаёт работу с fiber.Ctx, структуру проекта, безопасность и обработку ошибок. ★ 3 580звёзд репо ffmpeg Правило для Cursor, которое задаёт агенту порядок работы с FFmpeg: вызовы через libav*, двухпроходное кодирование и закреплённые сборки в CI. ★ 3 580звёзд репо fabric-js Правило задаёт практики для fabric-js в JavaScript и TypeScript: модульные импорты, выбор типа canvas и приёмы ускорения рендера. ★ 3 580звёзд репо express Правило для Cursor задаёт структуру Express.js-проекта: слои, конфиг через .env, async/await, валидацию ввода и защитные middleware. ★ 3 580звёзд репо expo Задаёт стандарты разработки мобильных приложений на Expo: структуру папок, Expo Router, TypeScript и правила мемоизации. ★ 3 580звёзд репо eslint Правило для Cursor с рекомендациями по настройке ESLint в проектах JavaScript и TypeScript. Помогает находить ошибки, проверять возвращаемые значения и поддерживать единый стиль кода. ★ 3 580звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой