Преимущества использования Rust в Django‑проектах

6 декабря 2025 г.

Rust — это системный язык программирования, который сочетает в себе высокую производительность, строгую проверку памяти и современный синтаксис. Интеграция Rust‑кода в Django‑приложение позволяет решить ряд задач, которые обычно требуют отдельного оптимизационного усилия.

  • Высокая производительность. Rust компилируется в нативный машинный код, поэтому тяжёлые вычисления (обработка изображений, криптография, машинное обучение) работают почти так же быстро, как на C/C++.
  • Безопасность памяти. За счёт системы владения (ownership) и заимствования (borrowing) в Rust практически исключаются такие ошибки, как use‑after‑free и переполнение буфера, что повышает надёжность сервиса.
  • Совместимость с Python. С помощью проекта PyO3 можно собрать Rust‑библиотеку в виде Python‑модуля, который импортируется обычным import и вызывается из любого места Django‑кода.
  • Уменьшение нагрузки на сервер. Перенос CPU‑интенсивных задач в Rust снижает потребление ресурсов, позволяя обслуживать больше запросов без масштабирования инфраструктуры.
  • Лёгкая упаковка в Docker. Rust‑бинарники небольшие, а процесс сборки полностью автоматизируемый, что упрощает создание контейнеров с предсказуемым размером.

Установка необходимых инструментов

Для начала подготовим окружение, которое понадобится как для разработки, так и для сборки Docker‑образа.

  • Rust. Установите официальным скриптом:
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    После установки добавьте путь в PATH:
    export PATH="$HOME/.cargo/bin:$PATH"
  • Python и pip. Убедитесь, что установлен Python 3.9+ и менеджер пакетов pip.
  • PyO3 и maturin. Для упрощённой сборки Rust‑модулей под Python удобно использовать maturin:
    pip install maturin
  • Docker. Скачайте и установите Docker с официального сайта.

Создание Rust‑библиотеки

Создадим отдельный пакет, который будет экспортировать функции в виде Python‑модуля.

# В терминале
cargo new --lib my_rust_lib
cd my_rust_lib

Отредактируем Cargo.toml:

[package]
name = "my_rust_lib"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]   # важный параметр для создания динамической библиотеки

[dependencies]
pyo3 = { version = "0.20", features = ["extension-module"] }

И реализуем простую функцию в src/lib.rs:

use pyo3::prelude::*;

/// Сложение двух целых чисел
#[pyfunction]
fn add(a: i64, b: i64) -> PyResult {
    Ok(a + b)
}

/// Пример более тяжёлой функции – вычисление факториала
#[pyfunction]
fn factorial(n: u64) -> PyResult {
    Ok((1..=n).product())
}

/// Регистрация функций в модуле
#[pymodule]
fn my_rust_lib(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(add, m)?)?;
    m.add_function(wrap_pyfunction!(factorial, m)?)?;
    Ok(())
}

Соберём пакет в виде Python‑модуля с помощью maturin:

maturin develop --release

После успешной сборки в текущем виртуальном окружении появится модуль my_rust_lib, который можно импортировать в Python.

Интеграция Rust‑модуля в Django

Создадим базовый Django‑проект и подключим к нему наш Rust‑модуль.

# Создание проекта
django-admin startproject mysite
cd mysite
python -m venv venv
source venv/bin/activate
pip install django
django-admin startapp core

Установим наш только‑что собранный модуль в виртуальное окружение проекта:

pip install -e ../my_rust_lib   # путь к каталогу с Rust‑пакетом

Создадим небольшую обёртку, чтобы не «запачкать» Django‑код прямыми вызовами ctypes:

# core/rust_wrapper.py
from my_rust_lib import add, factorial

def add_numbers(a: int, b: int) -> int:
    return add(a, b)

def calc_factorial(n: int) -> int:
    return factorial(n)

Теперь используем эти функции в представлениях:

# core/views.py
from django.http import JsonResponse
from .rust_wrapper import add_numbers, calc_factorial

def add_view(request):
    a = int(request.GET.get('a', 0))
    b = int(request.GET.get('b', 0))
    result = add_numbers(a, b)
    return JsonResponse({'result': result})

def factorial_view(request):
    n = int(request.GET.get('n', 1))
    result = calc_factorial(n)
    return JsonResponse({'result': result})

Не забудьте добавить маршруты в core/urls.py и подключить их в mysite/urls.py.

Docker‑контейнер для Django + Rust

Для продакшн‑развёртывания удобно собрать всё в один образ. Ниже пример Dockerfile, который:

  • Устанавливает системные зависимости;
  • Собирает Rust‑библиотеку в режиме release;
  • Устанавливает Python‑зависимости;
  • Запускает Django‑сервер.
# Dockerfile
FROM python:3.11-slim AS base

# Устанавливаем системные пакеты, необходимые для сборки Rust
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential curl git && \
    rm -rf /var/lib/apt/lists/*

# Устанавливаем Rust (rustup)
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"

# Устанавливаем maturin для сборки Python‑модулей
RUN pip install --no-cache-dir maturin

# Копируем код проекта
WORKDIR /app
COPY . /app/

# Сборка Rust‑модуля и установка Python‑зависимостей
RUN cd my_rust_lib && maturin develop --release
RUN pip install --no-cache-dir -r requirements.txt

# Открываем порт Django
EXPOSE 8000

# Запуск сервера
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Файл requirements.txt может выглядеть так:

django>=4.2
# остальные зависимости проекта

Собираем и запускаем контейнер:

# Сборка образа
docker build -t mysite:latest .

# Запуск
docker run -p 8000:8000 mysite:latest

После старта откройте в браузере http://localhost:8000/add/?a=5&b=7 – получите JSON {"result":12}. Аналогично /factorial/?n=6 вернёт {"result":720}.

Полный пример структуры проекта

.
├── Dockerfile
├── requirements.txt
├── mysite/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── core/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations/
│   ├── models.py
│   ├── rust_wrapper.py   # ← обёртка над Rust‑модулем
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── my_rust_lib/
    ├── Cargo.toml
    └── src/
        └── lib.rs

Заключение

Интеграция Rust в Django‑проект позволяет:

  • Существенно ускорить тяжёлые вычисления без необходимости писать отдельные микросервисы.
  • Снизить риск ошибок, связанных с управлением памятью.
  • Сохранить привычный стек технологий (Python/Django) и при этом воспользоваться преимуществами системного языка.
  • Легко упаковать всё в Docker‑образ, что упрощает деплой и масштабирование.

Благодаря PyO3 и maturin процесс сборки и подключения Rust‑модулей к Python стал почти таким же простым, как установка обычного пакета из pip. Попробуйте добавить Rust‑компонент в свой следующий Django‑проект и оцените прирост производительности в реальных задачах.

PREVIOUS ARTICLE
NEXT ARTICLE