Python
April 2, 2024

Как Начать Работу с Django: Первые Шаги в Разработке Веб-Приложений

Django — это мощный фреймворк для веб-разработки на Python, который позволяет строить сложные веб-приложения быстро и с минимальными усилиями. Он следует принципу "Batteries included", предлагая множество встроенных функций для реализации распространенных задач веб-разработки. В этой статье мы рассмотрим, как начать работу с Django и сделать первые шаги в создании веб-приложений.

Для удобства разделим руководство на несколько шагов.

Знаете ли вы, что название фреймворка Django (произносится как "Джанго") вдохновлено именем Джанго Рейнхардта, легендарного бельгийского джазового гитариста ромского происхождения? Разработчики Django, Адриан Холовати и Саймон Уиллисон, выбрали это имя в знак уважения к музыканту, известному своим мастерством и способностью адаптироваться к изменениям, даже несмотря на серьёзные травмы руки. Так же, как Джанго Рейнхардт создавал великолепную музыку, несмотря на свои физические ограничения, фреймворк Django стремится облегчить процесс разработки веб-приложений, делая его более гибким и доступным. 🎸✨

Шаг 0: Установка Python и настройка виртуальной среды с использованием venv

Убедитесь, что на вашем компьютере установлен Python. Django поддерживает Python 3.6 и выше. Вы можете скачать последнюю версию Python с официального сайта python.org. Также потребуются некоторые дополнительные модули из репозиториев

Установка в Ubuntu:

sudo apt install python3

Fedora/CentOS/Rocky/Alma:

sudo dnf install python

Перед началом работы с Django полезно создать виртуальную среду Python для изоляции зависимостей проекта. Это позволит вам управлять пакетами для разных проектов независимо и избежать возможных конфликтов. В Python 3.3 и выше для этого можно использовать модуль venv.

В Ubuntu venv может отсутствовать, поэтому устанавливаем его отдельно:

sudo apt install python3-venv

Создание виртуальной среды

  1. Откройте терминал на вашем компьютере.
  2. Перейдите в каталог, где будет располагаться ваш проект Django. Если такого каталога нет, создайте его с помощью команды mkdir myproject и затем перейдите в него командой cd myproject.
  3. Выполните следующую команду для создания виртуальной среды:sh
  4. python3 -m venv myvenv Здесь myvenv — это имя виртуальной среды. Вы можете выбрать любое другое имя.

Активация виртуальной среды

Чтобы активировать виртуальную среду, выполните следующую команду:

На Windows:

myvenv\Scripts\activate

На macOS и Linux:

source myvenv/bin/activate 

После активации в командной строке должен появиться префикс (myvenv), указывающий на то, что виртуальная среда активирована. Теперь любые Python-пакеты будут устанавливаться исключительно в эту среду.

Для того чтобы максимально расширить функциональность Django и использовать все его "батарейки", вам потребуются дополнительные пакеты, которые улучшат работу с изображениями, базами данных и не только. Ниже представлен список рекомендуемых пакетов для начала работы с полным стеком возможностей Django:

Pillow: Необходим для работы с изображениями в Django, например, при использовании поля ImageField в модели.

pip install Pillow

Для поддержки различных форматов изображений установим необходимые пакеты на Ubuntu:

sudo apt install python3-dev libtiff5-dev libjpeg8-dev libopenjp2-7-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python3-tk libharfbuzz-dev libfribidi-dev libxcb1-dev

А именно:

  • libjpeg8-dev обеспечивает поддержку JPEG.
  • libtiff5-dev обеспечивает поддержку TIFF.
  • libopenjp2-7-dev обеспечивает поддержку JPEG 2000.
  • zlib1g-dev необходим для поддержки сжатия в PNG и других форматах.
  • libfreetype6-dev добавляет поддержку шрифтов, что важно для рендеринга текста на изображениях.
  • liblcms2-dev добавляет поддержку управления цветом (Color Management System).
  • libwebp-dev обеспечивает поддержку формата WebP.
  • tcl8.6-dev и tk8.6-dev необходимы для работы Tkinter и поддержки изображений в GUI.
  • python3-tk устанавливает Tkinter для Python, что позволяет использовать Pillow в приложениях с графическим интерфейсом.
  • libharfbuzz-dev и libfribidi-dev нужны для поддержки комплексного текстового рендеринга (например, арабского и иврита).
  • libxcb1-dev требуется для некоторых операций на низком уровне с X11 (X Window System).

Для Fedora/CentOS/Rocky/Alma:

sudo dnf install python3-devel libtiff-devel libjpeg-devel openjpeg2-devel zlib-devel libfreetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel python3-tkinter harfbuzz-devel fribidi-devel libxcb-devel

psycopg2: Рекомендуемый адаптер PostgreSQL для Django. Он нужен, если вы используете PostgreSQL в качестве базы данных для вашего проекта.

pip install psycopg2

Чтобы использовать psycopg2, вам потребуется установить не только сам пакет psycopg2, но и некоторые системные зависимости для компиляции этого расширения из исходного кода. Вот как вы можете это сделать на системах Ubuntu и RHEL-основанных.

Ubuntu

Для установки необходимых зависимостей на системе Ubuntu используйте следующие команды:

sudo apt update
sudo apt install libpq-dev python3-dev
  • libpq-dev — это библиотека разработчика для PostgreSQL, необходимая для компиляции psycopg2.
  • python3-dev — пакет, содержащий заголовочные файлы для разработки расширений Python, также требуется для компиляции psycopg2.

Для Fedora/CentOS/Rocky/Alma:

На системах, основанных на RHEL, команды для установки зависимостей будут немного отличаться:

sudo dnf update
sudo dnf install postgresql-devel python3-devel

А можно просто установить binary пакет 😸 (не требует компиляции, т.е. не нужно ничего доустанавливать в систему):

pip install psycopg2-binary

Шаг 1: Установка Django

После установки Python и настройки venv, установите Django с помощью пакетного менеджера pip. Откройте командную строку или терминал и введите следующую команду:

pip install django

Эта команда является стандартным способом установки Django через систему управления пакетами Python (pip). В большинстве случаев она работает без проблем, но есть несколько потенциальных "подводных камней", о которых стоит знать:

1. Конфликты зависимостей

Если вы устанавливаете Django в глобальную среду Python без использования виртуальной среды (venv ), вы рискуете столкнуться с конфликтами зависимостей между разными проектами. Например, один проект может требовать одну версию Django (или других пакетов), а другой проект — другую. Это может привести к ошибкам и нестабильности в работе ваших приложений. Поэтому удостоверьтесь, что вы установили и настроили venv правильно

2. Проблемы с правами доступа

При выполнении команды pip install без виртуальной среды на некоторых системах (особенно на macOS и Linux) может потребоваться право администратора (использование sudo), что может привести к установке пакетов в системные директории. Это не рекомендуется, так как изменения в системных библиотеках могут повлиять на работу операционной системы и других Python-приложений.

3. Версионные несоответствия

Если у вас уже установлен Django для другого проекта, выполнение этой команды без указания конкретной версии (pip install django==3.2, например) приведет к установке последней доступной версии. Это может вызвать проблемы с совместимостью, если ваш проект зависит от функционала, который изменился или был удален в новой версии.

4. Зависимости от окружения

Некоторые функции Django, такие как работа с изображениями через ImageField, требуют дополнительных системных библиотек (например, libjpeg и zlib для Pillow). Если соответствующие библиотеки не установлены на вашей системе, функциональность, зависящая от них, может работать некорректно.

Как избежать проблем

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

Следуя этим рекомендациям, вы минимизируете риск возникновения проблем при установке и последующей работе с Django.

Шаг 2: Создание Проекта

Создайте новый проект Django, используя команду django-admin. Перейдите в директорию, где вы хотите разместить свой проект, и выполните команду:

django-admin startproject myproject

Разберем подробнее, что делает эта команда и какие компоненты она создает.

Что делает команда

Когда вы выполняете команду django-admin startproject myproject, Django выполняет следующие действия:

  1. Создает каталог проекта: Название каталога соответствует названию вашего проекта (myproject в данном примере). Этот каталог будет содержать все файлы и папки вашего проекта.
  2. Генерирует необходимые файлы: Внутри каталога проекта создаются следующие файлы:
    • manage.py: Утилита командной строки, позволяющая взаимодействовать с проектом Django. С ее помощью можно, например, запускать сервер разработки, создавать миграции и применять их к базе данных.
    • Каталог myproject/: Содержит настройки проекта, включая settings.py, urls.py, asgi.py и wsgi.py.
      • settings.py: Файл настроек Django проекта. Здесь хранятся конфигурации, такие как настройки базы данных, конфигурация статических файлов, зарегистрированные приложения и многое другое.
      • urls.py: Файл для объявления маршрутов URL проекта. Здесь определяются URL-адреса и связываются с представлениями.
      • asgi.py и wsgi.py: Файлы точек входа для ASGI-совместимых и WSGI-совместимых веб-серверов соответственно. Они нужны для развертывания проекта на сервере.

Параметры и аргументы

  • startproject — это команда, которую вы вызываете через django-admin или python manage.py.
  • myproject — это название вашего нового проекта. Вы можете выбрать любое имя, которое соответствует правилам именования переменных в Python.

Вы можете также указать дополнительный путь, куда будет создан проект:

django-admin startproject myproject /path/to/your-directory

Если путь не указан, проект создается в текущей директории.

Важные замечания

  • Уникальность названия проекта: Имя проекта не должно совпадать с именами стандартных модулей Python и Django, чтобы избежать конфликтов в импортах.
  • Безопасность: После создания проекта важно настроить SECRET_KEY в settings.py и убедиться, что он остается в секрете, а также настроить другие параметры безопасности в соответствии с рекомендациями Django.

Команда startproject — это всего лишь начальный этап разработки проекта на Django. После ее выполнения вам предстоит создать приложения внутри проекта, определить модели, представления, шаблоны, настроить маршрутизацию и многое другое.

Шаг 3: Запуск сервера для разработки

Перейдите в директорию проекта и запустите сервер Django для разработки, используя команду python manage.py runserver. Это позволит вам просмотреть ваш проект в браузере.

cd myproject
python manage.py runserver

Она запускает легковесный веб-сервер разработки, который входит в стандартный набор инструментов Django. Этот сервер предназначен только для использования во время разработки и тестирования; для развертывания приложения в продакшене следует использовать более мощные сервера, такие как Gunicorn или uWSGI в сочетании с Nginx или Apache.

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

  • Быстрый старт: Позволяет быстро запустить веб-сервер для разработки и тестирования приложения без необходимости настройки или установки внешнего веб-сервера.
  • Автоматическая перезагрузка: Сервер автоматически перезагружается при изменении кода проекта, что упрощает процесс разработки.
  • Отладочная информация: В режиме отладки (DEBUG=True в settings.py) веб-сервер предоставляет подробные отчеты об ошибках, что облегчает отладку приложения.

Как использовать

Чтобы запустить сервер, откройте терминал или командную строку, перейдите в каталог вашего проекта Django, где находится файл manage.py, и выполните команду:

python manage.py runserver

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

Настройка порта и адреса

Если порт 8000 уже используется или вам нужно использовать другой адрес, вы можете указать IP-адрес и порт в командной строке:

python manage.py runserver 8080

или

python manage.py runserver 0.0.0.0:8000

Первый вариант запустит сервер на порту 8080, а второй — позволит подключаться к серверу с любого IP-адреса, что может быть полезно для тестирования на других устройствах в вашей локальной сети.

Важные замечания

  • Не для продакшена: Веб-сервер, запускаемый командой runserver, не предназначен для использования в продакшене из-за ограниченных возможностей по обеспечению безопасности и производительности.
  • Безопасность: При запуске сервера с доступом с любого IP-адреса (0.0.0.0) убедитесь, что вы понимаете потенциальные риски безопасности, особенно если ваш компьютер подключен к интернету.

Использование python manage.py runserver значительно упрощает процесс разработки на Django, предоставляя быстрый и удобный способ тестирования ваших веб-приложений.

Шаг 4: Создание Приложения

В Django проекты состоят из приложений, каждое из которых выполняет свою функцию. Создайте свое первое приложение с помощью команды python manage.py startapp myapp, заменив myapp на название вашего приложения.

python manage.py startapp myapp

Функциональность команды

Когда вы выполняете команду python manage.py startapp myapp, Django автоматически создает структуру каталогов и файлов, необходимых для нового приложения. Вот что включает в себя базовая структура созданного приложения:

  • migrations/: Каталог для миграций базы данных. Миграции позволяют Django отслеживать изменения в моделях и применять эти изменения к базе данных.
  • __init__.py: Пустой файл, который указывает Python, что директория должна быть рассмотрена как Python-пакет.
  • admin.py: Файл для регистрации моделей приложения в админ-панели Django.
  • apps.py: Файл настроек приложения. Здесь можно включить любую конфигурацию, специфичную для приложения.
  • models.py: Файл для определения моделей данных. Модели в Django описывают структуру ваших данных и предоставляют механизмы для управления (создание, чтение, обновление, удаление) этими данными.
  • tests.py: Файл для написания тестов приложения. Тестирование является ключевым аспектом разработки надежных приложений.
  • views.py: Файл для определения представлений приложения. Представления отвечают за логику обработки запросов и формирование ответов для пользователей.

Использование

Создание приложения обычно является одним из первых шагов после создания нового проекта Django. Приложения в Django предназначены для инкапсуляции функционала, связанного с определенной областью работы сайта (например, блог, форум, система пользователей).

Примеры использования

Допустим, вы хотите создать приложение для управления блогом внутри вашего проекта Django. В этом случае вы бы использовали следующую команду:

python manage.py startapp blog

Это создаст новое приложение blog со всей необходимой начальной структурой каталогов и файлов.

Важные замечания

  • Модульность: Приложения в Django предназначены для того, чтобы быть повторно используемыми. Идеально, чтобы каждое приложение выполняло одну функцию и могло быть легко перенесено в другой проект.
  • Регистрация приложений: После создания нового приложения не забудьте добавить его в список INSTALLED_APPS в файле settings.py вашего проекта, чтобы Django мог его учитывать.

Пример INSTALLED_APPS:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'myapp',
]

Используя startapp, вы можете быстро добавлять новые функции и компоненты в свой проект, сохраняя при этом код организованным и управляемым.

Шаг 5: Создание Моделей и Миграция Базы Данных

Модели в Django являются мощным инструментом для представления таблиц баз данных и взаимодействия с ними. Они позволяют определять структуру данных вашего приложения на высоком уровне, абстрагируясь от конкретных SQL-запросов. Django заботится о многих низкоуровневых деталях, таких как создание схемы базы данных и управление соединениями. В качестве примера, давайте создадим простую модель для блога, которая будет представлять запись в блоге.

Пример модели записи блога

Предположим, мы хотим создать приложение блога, где каждая запись содержит заголовок, текст и дату публикации. В Django мы можем описать такую запись, создав класс модели в файле models.py внутри приложения:

from django.db import models
from django.utils import timezone

class Post(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()
    published_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

В этом примере:

  • Post - класс нашей модели, который наследуется от models.Model, делая его Django-моделью.
  • title - поле модели, предназначенное для заголовка записи. Мы используем CharField, что подразумевает строковый тип данных с ограничением длины.
  • text - поле для содержания записи. TextField используется для больших текстов без ограничения по длине.
  • published_date - дата и время публикации записи. DateTimeField принимает Python объекты datetime, default=timezone.now автоматически устанавливает время создания объекта модели.

Метод __str__ определен для того, чтобы при печати объекта модели (например, в консоли администратора Django) отображался его заголовок.

Работа с моделями

После определения модели необходимо произвести миграцию для создания соответствующей таблицы в базе данных:

python manage.py makemigrations
python manage.py migrate

Эти команды генерируют SQL-код для создания таблицы post и затем применяют эту миграцию к базе данных, фактически создавая таблицу.

Теперь вы можете создавать, изменять, удалять и искать записи в блоге через Django ORM (Object-Relational Mapping), не прибегая к написанию SQL-кода. Например, создание новой записи в блоге:

from myapp.models import Post

new_post = Post(title="Пример записи", text="Текст примера записи")
new_post.save()

Django ORM позволяет вам взаимодействовать с базой данных на Python, что делает процесс разработки более быстрым, безопасным и удобным.

Шаг 6: Создание Представлений и Шаблонов

Представления (views) обрабатывают запросы и возвращают ответы. Создайте представления в файле views.py вашего приложения. Чтобы отобразить данные, используйте шаблоны, создавая HTML-файлы в директории templates.

Django шаблоны (templates) — это мощная система для генерации HTML-документов, которая позволяет разработчикам эффективно создавать динамические веб-страницы. Шаблоны предназначены для разделения логики приложения и его представления, что соответствует принципу "разделение забот" (Separation of Concerns, SoC) и делает код более читаемым, удобным для поддержки и масштабирования.

Основные концепции

Язык шаблонов Django: Django предоставляет собственный язык шаблонов, который имеет простой синтаксис, предназначенный для выражения логики представления. В шаблонах можно использовать переменные, циклы, условные выражения и фильтры для изменения отображаемых данных.

Наследование шаблонов: Эта функция позволяет определять базовый шаблон с общей структурой страницы (например, header, footer), который можно наследовать и расширять в дочерних шаблонах. Это упрощает управление повторяющимися элементами дизайна на различных страницах сайта.

Использование шаблонов

Шаблоны Django обычно хранятся в каталоге templates внутри приложения. Для отображения страницы используется функция представления, которая загружает шаблон, передает в него контекст (набор переменных) и возвращает сгенерированный HTML-код клиенту.

Пример простого шаблона hello.html:

<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>Hello, {{ name }}!</h1>
</body>
</html>

Здесь {{ title }} и {{ name }} — это переменные, значения которых будут переданы из функции представления.

Функция представления может выглядеть примерно так:

from django.shortcuts import render

def hello_view(request):
    context = {'title': 'Приветствие', 'name': 'Мир'}
    return render(request, 'hello.html', context)

Функция render принимает объект запроса, путь к шаблону и контекст — и возвращает сгенерированный HTML.

Фильтры и теги

Язык шаблонов Django включает в себя множество встроенных фильтров и тегов, которые делают работу с данными и логикой представления ещё более гибкой. Например, фильтр lower может быть использован для преобразования текста к нижнему регистру:

{{ name|lower }}

А тег for позволяет итерировать по спискам или наборам данных:

<ul>
{% for item in item_list %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

Шаг 7: Настройка URL-адресов

Для того чтобы Django знал, какие представления использовать для разных URL-адресов, необходимо настроить маршрутизацию. Это делается в файле urls.py вашего проекта и приложения.

urls.py играет важную роль в определении схемы URL вашего веб-приложения. Это конфигурационный файл, где вы указываете соответствие между URL-адресами и представлениями, которые должны быть вызваны при обращении к этим адресам. Давайте разберемся, как использовать urls.py как в отдельных приложениях, так и во всем проекте.

Использование в проекте

В корневом каталоге проекта обычно находится файл urls.py, который создается автоматически при создании проекта с помощью команды django-admin startproject. Этот файл предназначен для объявления глобальной схемы URL всего проекта. Пример использования:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('myapp.urls')),  # подключение конфигурации урлов приложения
]

Здесь мы используем функцию include(), чтобы включить URL-конфигурацию отдельного приложения (myapp). Это позволяет организовать URL-адреса, относящиеся к конкретному приложению, в отдельном файле, делая структуру проекта более четкой и модульной.

Использование в приложениях

Для каждого приложения в Django можно создать свой собственный файл urls.py, где будут описаны URL-адреса, специфичные для этого приложения. Пример такого файла в приложении myapp:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('about/', views.about, name='about'),
]

В этом файле мы определяем URL-пути внутри приложения myapp: корневой URL ('') соответствует представлению index, а URL about/ соответствует представлению about.

Советы по организации URL

  1. Используйте именованные URL-адреса: это позволяет ссылаться на них в шаблонах и представлениях по имени, что упрощает изменение URL-адресов в будущем, не затрагивая остальной код.
  2. Разделяйте URL-конфигурацию по приложениям: это делает код более модульным и упрощает навигацию по проекту.
  3. Используйте include() для инклудирования URL-конфигураций приложений: это позволяет легко расширять проект, добавляя новые приложения без необходимости модифицировать глобальный файл urls.py.

Организуя URL-адреса вашего проекта и приложений с помощью urls.py, вы получаете четкую и гибкую систему маршрутизации, которая позволяет легко управлять доступом к различным частям вашего веб-приложения.

Заключение

С этими шагами вы успешно начнете работу с Django и сможете развивать свое веб-приложение, используя мощные и гибкие возможности этого фреймворка. В следующий раз мы более подробно пройдемся по каждому шагу и рассмотрим какие возможности и подводные камни есть во фреймворке Django.