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

Что будешь использовать для создания endpoint?

3.0 Senior🔥 191 комментариев
#DevOps и инфраструктура#Django

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

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

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

Выбор технологии для создания REST API endpoint

Это практический вопрос, который показывает вашу способность выбирать правильные инструменты в зависимости от требований. В Python есть несколько популярных фреймворков для создания API endpoints.

Основные варианты

FastAPI — современный, быстрый фреймворк с автоматической документацией Django REST Framework — мощный фреймворк, зрелая экосистема Flask — лёгкий и гибкий, для простых API Starlette — асинхронный фреймворк (основа FastAPI)

FastAPI (рекомендация для новых проектов)

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

app = FastAPI()

# Модель данных (автоматическая валидация)
class User(BaseModel):
    id: int
    name: str
    email: str
    age: Optional[int] = None

# GET endpoint
@app.get("/api/v1/users/{user_id}")
async def get_user(user_id: int) -> User:
    """Получить пользователя по ID"""
    if user_id < 1:
        raise HTTPException(status_code=400, detail="Invalid user ID")
    
    # Обычно здесь вызов к БД через repository
    return User(id=user_id, name="John", email="john@example.com", age=30)

# POST endpoint
@app.post("/api/v1/users")
async def create_user(user: User) -> dict:
    """Создать нового пользователя"""
    # Валидация происходит автоматически благодаря Pydantic
    # Если некорректные данные — FastAPI вернёт 422 с ошибкой
    return {"message": "User created", "user_id": user.id}

# PUT endpoint
@app.put("/api/v1/users/{user_id}")
async def update_user(user_id: int, user: User) -> dict:
    """Обновить пользователя"""
    return {"message": "User updated", "user": user}

# DELETE endpoint
@app.delete("/api/v1/users/{user_id}")
async def delete_user(user_id: int) -> dict:
    """Удалить пользователя"""
    return {"message": f"User {user_id} deleted"}

Преимущества FastAPI:

  • Асинхронность по умолчанию (быстро)
  • Автоматическая валидация данных (Pydantic)
  • Auto-генерируемая документация (Swagger, ReDoc)
  • Type hints в Python (IDE поддерживает)
  • Миллисекундные ответы

Django REST Framework (для больших проектов)

from rest_framework import serializers, viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from django.shortcuts import get_object_or_404

# Модель
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    age = models.IntegerField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

# Serializer (для валидации и преобразования)
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'name', 'email', 'age', 'created_at']

# ViewSet (автоматически создаёт CRUD endpoints)
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    
    def get_queryset(self):
        # Фильтрация по query параметрам
        queryset = super().get_queryset()
        name = self.request.query_params.get('name')
        if name:
            queryset = queryset.filter(name__icontains=name)
        return queryset
    
    @action(detail=True, methods=['post'])
    def activate(self, request, pk=None):
        """Custom action: активировать пользователя"""
        user = self.get_object()
        # Логика активации
        return Response({'status': 'user activated'})

# URLs
from django.urls import path, include
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'users', UserViewSet)

urlpatterns = [
    path('api/v1/', include(router.urls)),
]

Преимущества Django REST Framework:

  • Встроенная аутентификация и разрешения
  • ORM для работы с БД
  • Админ-панель
  • Большая и зрелая экосистема
  • Хорошо документирован

Flask (для простых API)

from flask import Flask, request, jsonify
from functools import wraps

app = Flask(__name__)

# Простой middleware для проверки токена
def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = request.headers.get('Authorization')
        if not token:
            return jsonify({'error': 'Token missing'}), 401
        return f(*args, **kwargs)
    return decorated

# GET endpoint
@app.route('/api/v1/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    return jsonify({'id': user_id, 'name': 'John', 'email': 'john@example.com'})

# POST endpoint
@app.route('/api/v1/users', methods=['POST'])
@token_required
def create_user():
    data = request.get_json()
    if not data or 'name' not in data:
        return jsonify({'error': 'Invalid data'}), 400
    return jsonify({'message': 'User created', 'user_id': 1}), 201

# PUT endpoint
@app.route('/api/v1/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
    data = request.get_json()
    return jsonify({'message': 'User updated'})

# DELETE endpoint
@app.route('/api/v1/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
    return jsonify({'message': f'User {user_id} deleted'}), 204

if __name__ == '__main__':
    app.run(debug=True)

Преимущества Flask:

  • Простота для быстрого прототипирования
  • Гибкость в выборе компонентов
  • Минимальный overhead

Сравнение

КритерийFastAPIDjango RESTFlask
Скорость⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Простота⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Масштабируемость⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Документация⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Экосистема⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

Мой выбор в интервью

"Мой выбор зависит от требований проекта:

FastAPI — если нужна современная архитектура, высокая производительность и быстрое развитие с автоматической документацией. Это мой первый выбор для новых проектов.

Django REST Framework — если проект требует сложной бизнес-логики, встроенной аутентификации, админ-панели и масштабируемости на длительную перспективу.

Flask — для простых API, микросервисов или когда нужна максимальная гибкость.

Лично я предпочитаю FastAPI за его асинхронность, валидацию данных и отличную документацию. В текущих проектах я использую его для новых микросервисов и API.

Важный момент: независимо от выбора фреймворка, я всегда следую архитектурным принципам (DDD, Clean Architecture) и разделяю бизнес-логику от инфраструктуры."

Что будешь использовать для создания endpoint? | PrepBro