Разработка серверной части (Backend) для мобильного приложения на Python (Django/FastAPI)
Представьте: ваше мобильное приложение выросло до 100 000 DAU, а сервер перестаёт справляться с пиковыми нагрузками. MongoDB кластеризация уже не помогает — нужен отказоустойчивый бэкенд на Python с грамотной архитектурой. Python — второй по популярности язык для мобильных бэкендов после Node.js, и у нас есть две доминирующие опции: Django REST Framework — batteries-included, ORM, admin, auth из коробки; FastAPI — асинхронный, типобезопасный, быстрый старт. Выбор между ними зависит от требований к скорости разработки, производительности и размера команды. Наши инженеры с опытом 10+ лет помогут определиться и реализуют проект под ключ за 2–3 недели (MVP) или 1–3 месяца (полноценный бэкенд). Свяжитесь с нами, чтобы обсудить детали.
Как выбрать между Django REST Framework и FastAPI?
Ключевое различие — модель выполнения и встроенные возможности. FastAPI с первого дня работает асинхронно на asyncio, что даёт высокую пропускную способность при работе с I/O-bound операциями (сетевые запросы, работа с БД). Django REST Framework исторически синхронный, но с версии 4.1 поддерживает асинхронные view через ASGI. Если ваш проект требует real-time фич, WebSocket, высокой конкурентности — FastAPI очевидный выбор. Если же нужна быстрая разработка с админ-панелью и богатым ORM, DRF сэкономит недели.
FastAPI: когда нужна скорость и типизация
FastAPI строится на Pydantic и Starlette. Каждый endpoint автоматически валидирует входные данные через аннотации типов и генерирует OpenAPI-документацию:
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel, UUID4
from sqlalchemy.ext.asyncio import AsyncSession
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/token")
class CreatePostRequest(BaseModel):
title: str
content: str
author_id: UUID4
class PostResponse(BaseModel):
id: UUID4
title: str
content: str
created_at: datetime
class Config:
from_attributes = True
@app.post("/posts", response_model=PostResponse, status_code=201)
async def create_post(
body: CreatePostRequest,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
if body.author_id != current_user.id:
raise HTTPException(status_code=403, detail="Forbidden")
post = await post_service.create(db, body)
return post
Pydantic v2 (Rust-based) валидирует данные быстрее, чем большинство альтернатив. response_model автоматически сериализует ORM-объект и скрывает поля, которых нет в схеме (например, пароль-хеш не попадёт в ответ).
SQLAlchemy 2.x + AsyncSession для асинхронной работы с PostgreSQL через asyncpg:
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
engine = create_async_engine(settings.DATABASE_URL) # postgresql+asyncpg://...
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async def get_db():
async with AsyncSessionLocal() as session:
yield session
Alembic для миграций схемы БД — генерирует diff между моделями и текущей БД.
Аутентификация JWT
from jose import JWTError, jwt
from datetime import datetime, timedelta
def create_access_token(user_id: str) -> str:
expires = datetime.utcnow() + timedelta(minutes=15)
return jwt.encode(
{"sub": user_id, "exp": expires, "type": "access"},
settings.JWT_SECRET,
algorithm="HS256",
)
async def get_current_user(
token: str = Depends(oauth2_scheme),
db: AsyncSession = Depends(get_db),
) -> User:
try:
payload = jwt.decode(token, settings.JWT_SECRET, algorithms=["HS256"])
user_id: str = payload.get("sub")
except JWTError:
raise HTTPException(status_code=401, detail="Could not validate token")
user = await user_repo.get(db, user_id)
if not user:
raise HTTPException(status_code=401, detail="User not found")
return user
Django REST Framework: когда нужен полный стек
DRF выигрывает, когда нужно быстро получить admin-панель, богатый ORM с select_related/prefetch_related, встроенные permissions и throttling:
# serializers.py
class PostSerializer(serializers.ModelSerializer):
author_name = serializers.SerializerMethodField()
class Meta:
model = Post
fields = ['id', 'title', 'content', 'author_name', 'created_at']
read_only_fields = ['id', 'created_at']
def get_author_name(self, obj):
return obj.author.get_full_name()
# views.py
class PostViewSet(ModelViewSet):
serializer_class = PostSerializer
permission_classes = [IsAuthenticated]
throttle_classes = [UserRateThrottle]
def get_queryset(self):
return Post.objects.filter(author=self.request.user)\
.select_related('author')\
.order_by('-created_at')
select_related решает N+1 проблему: один SQL JOIN вместо запроса для каждого автора. prefetch_related — для many-to-many.
django-channels для WebSocket (чат, realtime). Celery + Redis для фоновых задач (отправка email, пуш-уведомлений, тяжёлые вычисления).
# tasks.py
from celery import shared_task
import firebase_admin.messaging as fcm
@shared_task(bind=True, max_retries=3, default_retry_delay=60)
def send_push_notification(self, token: str, title: str, body: str):
try:
message = fcm.Message(
token=token,
notification=fcm.Notification(title=title, body=body),
android=fcm.AndroidConfig(priority='high'),
apns=fcm.APNSConfig(payload=fcm.APNSPayload(aps=fcm.Aps(sound='default'))),
)
fcm.send(message)
except Exception as exc:
raise self.retry(exc=exc)
Сравнение подходов
| Критерий | FastAPI | Django REST Framework |
|---|---|---|
| Async из коробки | Да (asyncio) | Частично (Django 4.1+) |
| Скорость запуска | Высокая | Средняя |
| Admin-панель | Нет (сторонние) | Встроенная |
| ORM | SQLAlchemy / Tortoise | Django ORM |
| Документация API | Автогенерация (Swagger) | drf-spectacular |
| Подходит для | Новые проекты, API-only | Быстрый MVP с admin |
Типичные ошибки при выборе архитектуры бэкенда
- Игнорирование требований к real-time: если приложению нужны уведомления в реальном времени, лучше сразу закладывать WebSocket и асинхронный фреймворк. Переход с синхронного Django на async в процессе — затратная миграция.
- Недооценка микросервисной архитектуры: на старте достаточно монолита, но если планируется рост до 50+ эндпоинтов, стоит предусмотреть разбиение на микросервисы. Python хорошо подходит для микросервисов с использованием FastAPI или Nameko.
- Отсутствие автоматической документации API: мобильные разработчики тратят часы на согласование форматов. OpenAPI (Swagger) решает эту проблему.
Как обеспечить безопасность API?
Помимо JWT, мы используем CORS, rate limiting, валидацию входных данных, логирование подозрительной активности. Для защиты от SQL-инъекций применяем ORM с параметризованными запросами. Все секреты хранятся в Vault или AWS Secrets Manager. Регулярно обновляем зависимости.
Для дополнительной защиты внедряем TOTP через pyotp и QR-коды. Это снижает риски компрометации аккаунта на 99% (по данным OWASP).
Развёртывание
FastAPI или Django запускается через Uvicorn + Gunicorn с несколькими воркерами. Docker с многоэтапной сборкой для минимального образа. Nginx как reverse proxy. PostgreSQL + Redis в docker-compose для локала, RDS + ElastiCache для продакшена. С такой конфигурацией мы гарантируем SLA 99.9% и снижаем затраты на инфраструктуру до 40% по сравнению с монолитным подходом.
Этапы работ над бэкендом
- Анализ требований — изучаем ТЗ, нагрузки, интеграции. Оцениваем сроки.
- Проектирование API — спецификация OpenAPI, выбор стека.
- Разработка — реализация модулей, настройка БД, аутентификации, фоновых задач.
- Тестирование — unit-тесты, интеграционные, нагрузочные (locust/k6).
- Деплой — Docker, CI/CD (GitHub Actions), мониторинг (Prometheus + Grafana).
Что входит в разработку
- Проектирование API под требования мобильного клиента
- Настройка PostgreSQL + Alembic миграции
- Auth (JWT)
- CRUD-модули
- Push-уведомления (Firebase Admin SDK)
- Фоновые задачи (Celery)
- Docker + CI/CD
- Документация OpenAPI
- Консультации на всех этапах
Сроки и стоимость
MVP (Auth + 3–5 ресурсов): от 2 до 3 недель. Полноценный бэкенд: от 1 до 3 месяцев. Стоимость рассчитывается индивидуально после анализа требований. Наши инженеры с опытом 50+ проектов гарантируют качество и соблюдение сроков. Закажите разработку бэкенда под ключ — получите консультацию уже сегодня.







