Быстрый старт с Django

В рамках курса мы создадим и будем расширять простой Django-проект "hello-django". Рекомендую вам повторять все описанные шаги, а при желании — и экспериментировать над проектом самостоятельно.

Разрабатывать проекты на Django следует с применений виртуальных окружений. Для простых проектов без зависимостей ещё можно обойтись глобальным интерпретатором, но Web-приложения стоит сразу обособить.

Вы можете создать директорию под проект, а затем в ней завести виртуальное окружение вручную. Либо используйте один из инструментов, автоматизирующих этот процесс. Мы в Хекслете рекомендуем использовать poetry.

Устанавливаем django

Итак, директория под проект создана, как и виртуальное окружение. Теперь нужно установить сам Django. Также нам понадобится WSGI-сервер (про WSGI рассказывалось в курсе по Flask), так как мы будем запускать проект в "приближенном к боевому режиме". Установите пакеты django и gunicorn.

Если вы используете poetry, то добавьте django, как обычную зависимость, а gunicorn, как --dev-зависимость.

После установки обоих пакетов вам должны стать доступны команды

  • django-admin — команда для работы с Django-проектами,
  • gunicorn — команда для запуска WSGI-сервера Gunicorn.

В "ручном" окружении команды доступны после его активации. В случае poetry нужно вызывать команды с помощью poetry run: poetry run django-admin version и всё остальное в том же духе.

Проверим версию Django (нам подходит любая 3.0.0+):

$ django-admin version
3.0.4

Генерируем "болванку" проекта

Выполните команду django-admin startproject hello_django .

Имя "hello_django" будет именем Python-пакета, поэтому содержит подчёркивание в качестве разделителя.

"Точка" в команде означает, что генерируемое содержимое проекта будет расположено в текущей директории. У нас уже есть директория проекта, поэтому нам не нужен лишний уровень вложенности.

У вас должна получиться следующая структура:

$ tree .
.
├── hello_django
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Приведу краткое описание каждого файла:

  • manage.py — скрипт, используемый в процессе разработки для выполнения различных действий над проектом;
  • wsgi.py и asgi.py — точки входа в WSGI- и ASGI-приложения;
  • settings.py — модуль, содержащий все настройки проекта;
  • urls.py — модуль, описывающий правила маршрутизации запросов.

В процессе работы над проектом модифицировать нам предстоит лишь два модуля: settings.py и urls.py. Если вы заглянете в первый, то увидите конфигурацию по умолчанию: не пугайтесь её размера, просто ощутите, насколько много всего можно настроить в большом фреймворке!

Первая "вьюха", первый шаблон

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

Отредактируйте файл hello_django/urls.py: добавьте импорт

from hello_django import views

и сделайте так, чтобы список urlpatterns выглядел следующим образом:

urlpatterns = [
    path('', views.index),
    # path('admin/', admin.site.urls),
]

Мы добавили правило, которое назначает обработчиком "главной страницы" (пустого пути) вьюху views.index.

Правило подключения админки я пока закомментировал. До неё мы ещё доберёмся.

Создайте файл hello_django/views.py и запишите в него следующий код:

from django.shortcuts import render


def index(request):
    return render(request, 'index.html', context={
        'who': 'World',
    })

Здесь я использую одну из функций, позволяющих "просто сделать хорошо" — render. Она формирует HTML на основе указанного шаблона, используя при "рендеринге" данные из словаря context.

Теперь нам потребуется шаблон. Создайте директорию hello_django/templates и файл index.html в ней. В файл запишите это:

<h1>Hello, {{ who }}!</h1>

Тут {{ who }} означает подстановку значения из контекста.

Остаётся только подсказать Django, что шаблоны нужно искать и в пакете hello_django. Для этого добавляем строку "hello_django" в конец списка INSTALLED_APPS в модуле hello_django.settings.

Запускаем приложение

Для запуска сервера разработчика нужно выполнить команду ./manage.py runserver (или python manage.py runserver).

В случае poetry команда будет выглядеть так: poetry run python manage.py runserver.

Этой командой вы запускаете встроенный в Django сервер, который работает в однопоточном режиме (что упрощает отладку) и сам перезапускается, если вы меняете что-то в коде. Кроме того, этот сервер никогда и ничего не кэширует — это важно при редактировании шаблонов и статических файлов (JS, CSS).

При всех удобствах во время разработки dev-сервер совершенно не годится для запуска "в боевых условиях" (в силу той же однопоточности), поэтому Django позволяет себя запускать и в роли WSGI-приложения (а с недавнего времени и в роли модно-асинхронного ASGI-приложения).

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

$ export DJANGO_SETTINGS_MODULE=hello_django.settings
$ gunicorn hello_django.wsgi

В случае poetry перед gunicorn будет привычный poetry run.

В этот раз нам пришлось указать с помощью переменной окружения модуль, содержащий настройки проекта. Указывая разные модули настройки мы можем запускать приложение в разных режимах.

Как вы могли заметить, manage.py не используется при запуске на WSGI-сервере. Этот скрипт используется преимущественно на машине разработчика. Зато при запуске manage.py можно не определять переменную окружения DJANGO_SETTINGS_MODULE, так как скрипт сам подставляет значение этой переменной при запуске ядра Django.

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Javascript, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →