# Django

> Полнофункциональный веб-фреймворк на Python «с батарейками» — ORM, миграции, админка, шаблоны, формы, аутентификация и защита от типовых атак из коробки.

Источник: https://llmdocs.ru/wiki/django/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Язык**: Python
- **Первый выпуск**: июль 2005
- **Авторы**: Адриан Головати, Саймон Уиллисон (газета Lawrence Journal-World)
- **Разработчик**: Django Software Foundation
- **Архитектура**: MTV (модель — шаблон — представление)
- **Лицензия**: BSD-3-Clause
- **Выпуски**: новая версия раз в 8 месяцев, LTS — каждая третья (.2)
**Django** — веб-фреймворк на [Python](https://llmdocs.ru/wiki/python.md) для быстрой разработки сайтов и веб-приложений, работающий по принципу «батарейки в комплекте». Из коробки он даёт [ORM](https://llmdocs.ru/wiki/orm.md) и [миграции](https://llmdocs.ru/wiki/schema-migrations.md), автоматическую панель администратора, шаблонизатор, формы с валидацией, аутентификацию, кэширование, интернационализацию и защиту от распространённых атак.[1] На Django написаны (или начинались) Instagram, Pinterest, Disqus, Mozilla Developer Network, сайты многих СМИ и госорганов.

## История

Фреймворк создали в 2003–2005 годах Адриан Головати и Саймон Уиллисон в редакции газеты Lawrence Journal-World (Канзас), где нужно было быстро выпускать новостные сервисы под жёсткие дедлайны. В июле 2005 года код открыли под лицензией BSD и назвали в честь джазового гитариста Джанго Рейнхардта. С 2008 года проект развивает некоммерческий фонд Django Software Foundation. Новые версии выходят примерно раз в восемь месяцев; каждая версия с номером `.2` (4.2, 5.2) — LTS с поддержкой около трёх лет.[2]

## Архитектура

Django использует схему **MTV** — вариант MVC с другими названиями:

- **Model** — классы данных, отображаемые на таблицы [реляционной БД](https://llmdocs.ru/wiki/relational-database.md);
- **Template** — HTML-шаблоны с собственным языком (`{{ var }}`, `{% for %}`);
- **View** — функции или классы, принимающие [HTTP](https://llmdocs.ru/wiki/http.md)-запрос и возвращающие ответ.

Проект состоит из **приложений** (apps) — переиспользуемых модулей со своими моделями, представлениями и шаблонами. Маршруты задаются в `urls.py`, настройки — в `settings.py`, а управляющая утилита `manage.py` создаёт миграции, запускает сервер разработки и тесты.

## Быстрый пример

```bash
uv add django
uv run django-admin startproject mysite .
uv run python manage.py startapp blog
```

```python
# blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    published = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
```

```python
# blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Post

def post_list(request):
    posts = Post.objects.order_by("-published")[:10]
    return render(request, "blog/list.html", {"posts": posts})

def post_detail(request, pk):
    return render(request, "blog/detail.html",
                  {"post": get_object_or_404(Post, pk=pk)})
```

```bash
uv run python manage.py makemigrations && uv run python manage.py migrate
uv run python manage.py createsuperuser
uv run python manage.py runserver
```

Зарегистрировав модель в `admin.py` одной строкой `admin.site.register(Post)`, получаем готовый интерфейс для создания и редактирования записей.

## ORM и миграции

ORM Django строит [SQL](https://llmdocs.ru/wiki/sql.md)-запросы из цепочек методов: `Post.objects.filter(title__icontains="python").exclude(body="")`. Запросы ленивые и выполняются при первом обращении к результату. Связи (`ForeignKey`, `ManyToManyField`) загружаются отдельными запросами, поэтому для списков важно использовать `select_related` и `prefetch_related`, иначе возникает проблема «N+1 запросов». Поддерживаются [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md), [MySQL/MariaDB](https://llmdocs.ru/wiki/mysql-mariadb.md), [SQLite](https://llmdocs.ru/wiki/sqlite.md) и Oracle.

Изменения моделей фиксируются **миграциями** — Python-файлами, которые генерирует `makemigrations` и применяет `migrate`; их хранят в репозитории вместе с кодом.[4]

## Безопасность

Django включает защиту по умолчанию:[3]

- параметризованные запросы в ORM против [SQL-инъекций](https://llmdocs.ru/wiki/sql-injection.md);
- автоматическое экранирование в шаблонах против [XSS](https://llmdocs.ru/wiki/xss.md);
- токен против [CSRF](https://llmdocs.ru/wiki/csrf.md) в формах;
- [хеширование паролей](https://llmdocs.ru/wiki/password-storage.md) PBKDF2 с возможностью перейти на Argon2;
- защита от кликджекинга, проверка заголовка `Host`, настройки HTTPS и HSTS.

Перед выкладкой стоит запустить `manage.py check --deploy` — команда проверяет `DEBUG = False`, `SECRET_KEY`, cookie и другие пункты чек-листа.[7]

## API и асинхронность

Для [REST](https://llmdocs.ru/wiki/rest.md) API почти всегда используют **Django REST framework** (DRF) — сериализаторы, наборы представлений, аутентификацию, пагинацию и браузерный интерфейс API;[5] более лёгкая альтернатива с типами в стиле [FastAPI](https://llmdocs.ru/wiki/fastapi.md) — Django Ninja. Начиная с версии 3.0 Django поддерживает ASGI и асинхронные представления (`async def`), а с 4.1 — асинхронные методы ORM, хотя сам ORM внутри всё ещё во многом синхронный.[6]

## Развёртывание

В продакшене Django запускают через WSGI-сервер (Gunicorn, uWSGI) или ASGI-сервер (Uvicorn, Daphne) за [обратным прокси](https://llmdocs.ru/wiki/reverse-proxy.md) вроде [nginx](https://llmdocs.ru/wiki/nginx.md); статику собирают командой `collectstatic` и отдают прокси или CDN. Фоновые задачи традиционно выносят в Celery или RQ, в Django 6.0 появился встроенный фреймворк задач.

## Django, Flask или FastAPI

Django удобен, когда нужен полноценный сайт с базой, админкой, пользователями и формами — многое уже решено. [Flask](https://llmdocs.ru/wiki/flask.md) — минималистичное ядро, к которому всё подключается отдельно. [FastAPI](https://llmdocs.ru/wiki/fastapi.md) ориентирован на API с типами и асинхронностью. Цена «батареек» Django — больше соглашений и меньше свободы в устройстве проекта.

## См. также

- [Flask](https://llmdocs.ru/wiki/flask.md)
- [FastAPI](https://llmdocs.ru/wiki/fastapi.md)
- [ORM](https://llmdocs.ru/wiki/orm.md)
- [Python](https://llmdocs.ru/wiki/python.md)

## Источники

1. [Django documentation](https://docs.djangoproject.com/en/stable/)
2. [Django — Download and supported versions](https://www.djangoproject.com/download/)
3. [Django — Security in Django](https://docs.djangoproject.com/en/stable/topics/security/)
4. [Django — Migrations](https://docs.djangoproject.com/en/stable/topics/migrations/)
5. [Django REST framework](https://www.django-rest-framework.org/)
6. [Django — Asynchronous support](https://docs.djangoproject.com/en/stable/topics/async/)
7. [Django — Deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/)
