Преимущества использования 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 | shPATH: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‑проект и оцените прирост производительности в реальных задачах.