← Назад к вопросам

Как применяются принципы REST в Python?

2.0 Middle🔥 171 комментариев
#Python Core#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Принципы REST в Python

REST (Representational State Transfer) — это архитектурный стиль, который определяет правила взаимодействия между клиентом и сервером. В Python принципы REST применяются в основном при разработке веб-приложений и API.

Основные принципы REST

1. Ресурсы как основная единица В REST каждый ресурс (пользователь, пост, продукт) имеет уникальный идентификатор (URL). Ресурсы — это существительные, не глаголы:

# ✅ Правильно — ресурсы как существительные
GET /api/users
GET /api/users/123
GET /api/users/123/posts

# ❌ Неправильно — глаголы в URL
GET /api/get_users
GET /api/fetch_user_by_id?id=123

2. Использование HTTP методов Каждый метод имеет определённое предназначение:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    id: int
    name: str
    email: str

# GET — получение ресурса
@app.get("/users/{user_id}")
async def get_user(user_id: int):
    return {"id": user_id, "name": "John"}

# POST — создание нового ресурса
@app.post("/users")
async def create_user(user: User):
    return {"id": 1, **user.model_dump()}

# PUT — полное обновление ресурса
@app.put("/users/{user_id}")
async def update_user(user_id: int, user: User):
    return {"id": user_id, **user.model_dump()}

# PATCH — частичное обновление
@app.patch("/users/{user_id}")
async def partial_update(user_id: int, data: dict):
    return {"id": user_id, **data}

# DELETE — удаление ресурса
@app.delete("/users/{user_id}")
async def delete_user(user_id: int):
    return {"message": "User deleted"}

3. Statelessness (Безстатность) Каждый запрос должен содержать всю необходимую информацию. Сервер не сохраняет контекст между запросами:

# ✅ Правильно — запрос полностью независим
@app.get("/api/posts")
async def get_posts(skip: int = 0, limit: int = 10, token: str = Header(...)):
    # Все данные переданы в запросе
    user = verify_token(token)  # Проверяем при каждом запросе
    return posts

# ❌ Неправильно — полагаемся на состояние сессии
current_user = None
@app.get("/api/posts")
async def get_posts():
    # Используем глобальное состояние
    return get_user_posts(current_user)

4. Правильные коды ответов HTTP статус коды передают информацию о результате:

from fastapi import FastAPI, status

app = FastAPI()

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    user = find_user(user_id)
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    return user  # 200 OK (по умолчанию)

@app.post("/users", status_code=status.HTTP_201_CREATED)
async def create_user(user: User):
    new_user = save_user(user)
    return new_user

@app.put("/users/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
async def update_user(user_id: int, user: User):
    update_in_db(user_id, user)
    # 204 No Content — успешно, но нет данных для ответа
    return None

5. Content Negotiation (Согласование контента) Сервер должен возвращать данные в нужном формате:

from fastapi import FastAPI, Header
from fastapi.responses import JSONResponse, PlainTextResponse

app = FastAPI()

@app.get("/data")
async def get_data(accept: str = Header(None)):
    data = {"message": "Hello"}
    
    if "application/json" in (accept or ""):
        return JSONResponse(data)
    elif "text/plain" in (accept or ""):
        return PlainTextResponse("Hello")
    
    return data  # JSON по умолчанию

6. Hypermedia (HATEOAS) Ответы должны содержать ссылки на связанные ресурсы:

from pydantic import BaseModel, Field

class UserResponse(BaseModel):
    id: int
    name: str
    _links: dict = Field(default_factory=dict)

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    user = find_user(user_id)
    return UserResponse(
        id=user.id,
        name=user.name,
        _links={
            "self": f"/api/users/{user_id}",
            "all_users": "/api/users",
            "posts": f"/api/users/{user_id}/posts"
        }
    )

Популярные фреймворки для REST API в Python

  • FastAPI — современный, быстрый, с автоматической документацией
  • Django REST Framework — мощный, с полным функционалом
  • Flask + Flask-RESTful — лёгкий, минималистичный

Применение REST принципов делает API предсказуемым, масштабируемым и понятным для разработчиков.