📖 Теория: Введение в Django

⚡ Кратко

Фреймворк — набор инструментов и структур для ускорения разработки. Библиотека — набор функций без жёстких ограничений на архитектуру.

Django — полнофункциональный Python-фреймворк: встроенный ORM, административная панель, маршрутизация, шаблоны, безопасность.

  • pip install django — установка
  • django-admin startproject config . — создать проект (точка = в текущей директории)
  • python manage.py runserver → http://127.0.0.1:8000/
  • settings.py: BASE_DIR, INSTALLED_APPS, MIDDLEWARE, DATABASES, TEMPLATES
  • urls.py: маршрутизация через path()

1. Фреймворк и библиотека

Фреймворк — набор инструментов, шаблонов и структур, предназначенных для упрощения и ускорения процесса разработки приложений.
Библиотека — набор функций и классов для выполнения конкретных задач. Не накладывает жёстких ограничений на архитектуру проекта.

Преимущества фреймворков

  • Ускорение разработки: готовые компоненты и структуры сокращают время разработки.
  • Соблюдение стандартов: у каждого фреймворка есть стандарты написания кода и структуры проекта.
  • Безопасность: встроенные механизмы защиты от атак и инструменты обработки ввода пользователей.
  • Масштабируемость: структуры, которые легко масштабировать при росте нагрузки.

Преимущества библиотек

  • Переиспользование кода: готовые функции и классы для различных проектов.
  • Разделение ответственности: разделение приложения на независимые модули.
  • Улучшение обслуживаемости: поддержка и обновление проще, чем разработка с нуля.

Популярные Python-фреймворки

  • Django — высокоуровневый фреймворк с ORM, административным интерфейсом и множеством встроенных инструментов. Принцип «batteries included».
  • Flask — лёгкий фреймворк, предоставляющий большую свободу в выборе компонентов и архитектуры.
  • FastAPI — современный фреймворк для API с автоматической генерацией документации и высокой производительностью.

2. Почему Django

Django — бесплатный и открытый фреймворк для разработки веб-приложений на Python. Предоставляет инструменты и структуру для создания эффективных и масштабируемых веб-приложений.
  • Широко применяется в индустрии: Instagram, Pinterest, Spotify построены с использованием Django.
  • Богатая экосистема расширений и пакетов: работа с API, аутентификация, аналитика и другие.
  • Поддержка различных БД: PostgreSQL, MySQL, SQLite, Oracle и другие.
  • Большое и активное сообщество разработчиков.

3. Создание первого проекта

Установка Django

# Создаём и активируем виртуальное окружение
python -m venv venv
venv\Scripts\activate  # Windows
# source venv/bin/activate  # macOS/Linux

# Устанавливаем Django
pip install django

Создание структуры проекта

Команда django-admin startproject создаёт структуру проекта. Принято использовать название config как имя конфигурационного пакета. Точка в конце означает «создать в текущей директории, не добавляя лишнюю вложенность»:

django-admin startproject config .

После выполнения команды появятся:

myproject/
├── config/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

4. Файл manage.py

manage.py — скрипт командной строки, который создаётся автоматически при создании нового проекта Django. Не является частью проекта и служит интерфейсом для управления проектом.

Основные функции manage.py

КомандаОписание
python manage.py runserverЗапуск сервера разработки
python manage.py startapp myappСоздание нового приложения
python manage.py makemigrationsСоздание файлов миграций
python manage.py migrateПрименение миграций к БД
python manage.py createsuperuserСоздание суперпользователя
python manage.py shellИнтерактивная оболочка Django

Запуск сервера разработки

Для запуска сервера выполните:

python manage.py runserver

Сервер запустится по адресу http://127.0.0.1:8000/. Перейдите по нему, чтобы увидеть стандартную начальную страницу Django с ракетой.

5. Структура проекта

__init__.py

__init__.py — специальный файл, который используется для обозначения каталога как пакета в Python.

Назначение:

  1. Инициализация пакета: указывает Python, что каталог должен рассматриваться как пакет.
  2. Разделение логики: позволяет организовывать код по модулям и подпакетам.
  3. Импортирование модулей: определяет, какие модули или функции доступны при импорте пакета.
  4. Инициализация данных: иногда используется для инициализации конфигураций при импорте.
# myapp/__init__.py
from .models import MyModel
from .views import my_view

default_app_config = 'myapp.apps.MyAppConfig'

asgi.py

asgi.py — используется для настройки ASGI-сервера (Asynchronous Server Gateway Interface). ASGI — спецификация для асинхронных приложений.
# config/asgi.py
import os
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_asgi_application()

wsgi.py

wsgi.py — используется для настройки WSGI-сервера (Web Server Gateway Interface). WSGI — спецификация для синхронных приложений.
# config/wsgi.py
import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_wsgi_application()

urls.py

urls.py — отвечает за маршрутизацию URL-адресов к соответствующим представлениям (views). Определяет, какие представления обрабатывают конкретные URL-адреса.
# config/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),  # маршруты приложения myapp
]

6. Файл settings.py

Используется для настройки всего проекта: параметры базы данных, язык, статические файлы, установленные приложения. Изменение settings.py — стандартный способ настроить поведение Django-приложения.

BASE_DIR

BASE_DIR — абсолютный путь к корневой директории проекта. Используется для настройки путей к шаблонам, статическим файлам, базам данных.
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
# Path(__file__) — объект Path для settings.py
# .resolve()     — преобразует в абсолютный путь
# .parent.parent — два уровня вверх (к корню проекта)

Использование для БД:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

INSTALLED_APPS

Список зарегистрированных приложений проекта. При создании нового приложения необходимо добавить его сюда:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',  # ваше приложение
]

MIDDLEWARE

MIDDLEWARE — список промежуточного ПО (middleware). Компоненты, обрабатывающие запросы и ответы между клиентом и сервером.
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Описание компонентов:

  • SecurityMiddleware — улучшает безопасность приложения (HTTPS, заголовки безопасности).
  • SessionMiddleware — управляет сессиями между запросами.
  • CommonMiddleware — общие операции: перенаправления URL, нормализация URL.
  • CsrfViewMiddleware — защита от атак CSRF (Cross-Site Request Forgery).
  • AuthenticationMiddleware — ассоциирует пользователя с текущим запросом через сессию.
  • MessageMiddleware — временные сообщения для пользователей (уведомления, ошибки).
  • XFrameOptionsMiddleware — защита от атак Clickjacking.

Создание собственного middleware

# myapp/middleware.py
class MyCustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Код до обработки запроса
        response = self.get_response(request)
        # Код после обработки запроса
        return response

Подключение в settings.py:

MIDDLEWARE = [
    # ... стандартные middleware ...
    'myapp.middleware.MyCustomMiddleware',
]

ROOT_URLCONF

ROOT_URLCONF — строка, указывающая на главный модуль URL-конфигурации проекта. Именно отсюда начинается маршрутизация.
ROOT_URLCONF = 'config.urls'

TEMPLATES

TEMPLATES — настройка системы шаблонов. Список словарей с параметрами конфигурации для каждого бэкенда шаблонов.
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],           # каталоги для поиска шаблонов
        'APP_DIRS': True,     # автопоиск в templates/ каждого приложения
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION

WSGI_APPLICATION — указывает на WSGI-приложение для развёртывания проекта. Важно для производственного сервера.
WSGI_APPLICATION = 'config.wsgi.application'

AUTH_PASSWORD_VALIDATORS

AUTH_PASSWORD_VALIDATORS — список валидаторов паролей. Обеспечивают надёжность паролей пользователей.
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {'min_length': 8}
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

Описание встроенных валидаторов:

  • UserAttributeSimilarityValidator — пароль не должен быть похож на атрибуты пользователя (имя, email).
  • MinimumLengthValidator — минимальная длина пароля (по умолчанию 8 символов).
  • CommonPasswordValidator — пароль не должен быть слишком простым или общеизвестным.
  • NumericPasswordValidator — пароль не должен состоять только из цифр.