Как применяются принципы REST в Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Принципы 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 предсказуемым, масштабируемым и понятным для разработчиков.