Django

Материал из llmdocs — справочник разработчика
Портал: Python
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 — больше соглашений и меньше свободы в устройстве проекта.

См. также

Источники

  1. Django documentation
  2. Django — Download and supported versions
  3. Django — Security in Django
  4. Django — Migrations
  5. Django REST framework
  6. Django — Asynchronous support
  7. Django — Deployment checklist