Django
| Язык | Python |
|---|---|
| Первый выпуск | июль 2005 |
| Авторы | Адриан Головати, Саймон Уиллисон (газета Lawrence Journal-World) |
| Разработчик | Django Software Foundation |
| Архитектура | MTV (модель — шаблон — представление) |
| Лицензия | BSD-3-Clause |
| Выпуски | новая версия раз в 8 месяцев, LTS — каждая третья (.2) |
Django — веб-фреймворк на Python для быстрой разработки сайтов и веб-приложений, работающий по принципу «батарейки в комплекте». Из коробки он даёт ORM и миграции, автоматическую панель администратора, шаблонизатор, формы с валидацией, аутентификацию, кэширование, интернационализацию и защиту от распространённых атак.[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 — классы данных, отображаемые на таблицы реляционной БД;
- Template — HTML-шаблоны с собственным языком (
{{ var }},{% for %}); - View — функции или классы, принимающие HTTP-запрос и возвращающие ответ.
Проект состоит из приложений (apps) — переиспользуемых модулей со своими моделями, представлениями и шаблонами. Маршруты задаются в urls.py, настройки — в settings.py, а управляющая утилита manage.py создаёт миграции, запускает сервер разработки и тесты.
Быстрый пример
uv add django
uv run django-admin startproject mysite .
uv run python manage.py startapp blog
# 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
# 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)})
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-запросы из цепочек методов: Post.objects.filter(title__icontains="python").exclude(body=""). Запросы ленивые и выполняются при первом обращении к результату. Связи (ForeignKey, ManyToManyField) загружаются отдельными запросами, поэтому для списков важно использовать select_related и prefetch_related, иначе возникает проблема «N+1 запросов». Поддерживаются PostgreSQL, MySQL/MariaDB, SQLite и Oracle.
Изменения моделей фиксируются миграциями — Python-файлами, которые генерирует makemigrations и применяет migrate; их хранят в репозитории вместе с кодом.[4]
Безопасность
Django включает защиту по умолчанию:[3]
- параметризованные запросы в ORM против SQL-инъекций;
- автоматическое экранирование в шаблонах против XSS;
- токен против CSRF в формах;
- хеширование паролей PBKDF2 с возможностью перейти на Argon2;
- защита от кликджекинга, проверка заголовка
Host, настройки HTTPS и HSTS.
Перед выкладкой стоит запустить manage.py check --deploy — команда проверяет DEBUG = False, SECRET_KEY, cookie и другие пункты чек-листа.[7]
API и асинхронность
Для REST API почти всегда используют Django REST framework (DRF) — сериализаторы, наборы представлений, аутентификацию, пагинацию и браузерный интерфейс API;[5] более лёгкая альтернатива с типами в стиле FastAPI — Django Ninja. Начиная с версии 3.0 Django поддерживает ASGI и асинхронные представления (async def), а с 4.1 — асинхронные методы ORM, хотя сам ORM внутри всё ещё во многом синхронный.[6]
Развёртывание
В продакшене Django запускают через WSGI-сервер (Gunicorn, uWSGI) или ASGI-сервер (Uvicorn, Daphne) за обратным прокси вроде nginx; статику собирают командой collectstatic и отдают прокси или CDN. Фоновые задачи традиционно выносят в Celery или RQ, в Django 6.0 появился встроенный фреймворк задач.
Django, Flask или FastAPI
Django удобен, когда нужен полноценный сайт с базой, админкой, пользователями и формами — многое уже решено. Flask — минималистичное ядро, к которому всё подключается отдельно. FastAPI ориентирован на API с типами и асинхронностью. Цена «батареек» Django — больше соглашений и меньше свободы в устройстве проекта.