Написание вашего первого приложения на Django, часть 1

Давайте учиться на примере.

В этом уроке мы расскажем о создании базового приложения для голосования.

Он будет состоять из двух частей:

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

Мы предполагаем, что вы уже установили Django. Вы можете узнать, установлена ли Django и какая версия, выполнив в командной строке следующую команду (указывается префиксом $):

$ python -m django --version
...\> py -m django --version

Если фреймворк Django установлен, вы увидите номер версии. Если нет, вы получите сообщение об ошибке «Нет модуля с именем django».

Этот учебник написан для Django 4.2, который поддерживает Python 3.8 и более поздние версии. Если версия Django не совпадает, вы можете обратиться к учебнику для вашей версии Django, используя переключатель версий в правом нижнем углу этой страницы, или обновить Django до самой новой версии. Если вы используете более старую версию Python, проверьте Какие версии Python можно использовать с Django?, чтобы найти совместимую версию Django.

Смотрите Как установить Django, чтобы узнать как удалить старые версии Django и установить последнюю версию.

Где можно получить помощь:

Если у вас возникли проблемы с прохождением этого руководства, перейдите в раздел часто задаваемых вопросов Получение справки.

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

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

Выполните в терминале в командной строке cd: смену каталога на тот, в котором вы сохранили код, затем запустите следующую команду:

$ django-admin startproject mysite
...\> django-admin startproject mysite

Это создаст каталог mysite в текущем каталоге. Если этого не произошло, то смотрите Проблемы с запуском django-admin.

Примечание

Не рекомендуется в качестве названия проекта названия встроенных компонентов Python или Django. Это значит, что следует избегать использования таких имен, как django (будет конфликт с самим фреймворком) или test (будет конфликтовать со стандартным пакетом Python).

Где этот код должен находится?

Если вы работаете на старом добром PHP (без использования современных фреймворков), вы, вероятно, привыкли размещать код в корне документа веб-сервера (в таком месте, как /var/www). В Django вы этого не сделаете. Это не очень хорошая идея - помещать любой из этого кода Python в корень документа вашего веб-сервера, потому что это рискует тем, что люди могут иметь возможность просматривать ваш код через Интернет. Это не очень хорошо для безопасности.

Размещайте свой код в каком-либо каталоге вне корневого каталога сервера, например /home/mycode.

Посмотрим, что создал startproject:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

Разберем, для чего нужны эти файлы и каталоги:

  • Внешний корневой каталог mysite/ — это контейнер для вашего проекта. Его имя не имеет значения для Джанго; Вы можете переименовать его на что угодно.
  • manage.py: утилита, позволяющая взаимодействовать с проектом различными способами. Вы можете прочитать все подробности о manage.py в django-admin и manage.py.
  • Внутренний каталог mysite/ это Python модуль вашего проекта. Его название вы будете использовать для импорта чего-либо из этого модуля (например, mysite.urls).
  • mysite/__init__.py: пустой файл, который сообщает Python, что этот каталог должен рассматриваться как пакет Python’а. Если вы новичок в Python, прочитайте больше о пакетах в официальной документации Python.
  • mysite/settings.py: Конфигурация и настройки проекта Django. В Настройки Django рассказано все о том, как работают настройки.
  • mysite/urls.py: указание URL проекта на Django, можно сказать, что это «оглавление» вашего проекта. Прочитайте больше информации о URL в Диспетчер URL.
  • mysite/asgi.py: точка входа для ASGI-совместимых веб-серверов для обслуживания вашего проекта. Смотрите Как развертывать с помощью ASGI для получения более подробной информации.
  • mysite/wsgi.py: Точка входа для WSGI совместимых веб-серверов для работы с проектом. Смотрите Как развертывать с помощью WSGI для уточнения деталей работы.

Сервер разработки

Давайте проверим, работает ли ваш проект Django. Перейдите во внешний каталог mysite, если вы этого еще не сделали, и выполните следующие команды:

$ python manage.py runserver
...\> py manage.py runserver

Вы увидите следующий вывод в командной строке:

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

сентября 06, 2023 - 15:50:53
Django version 4.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Примечание

Пока игнорируйте предупреждение о непримененных миграциях базы данных; мы разберемся с базой данных в ближайшее время.

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

Сейчас самое время отметить: не используйте этот сервер в чем-либо, напоминающем производственную среду. Он предназначен только для использования во время разработки. (Мы занимаемся созданием веб-фреймворков, а не веб-серверов).

Теперь, когда сервер запущен, зайдите на сайт http://127.0.0.1:8000/ с помощью веб-браузера. Вы увидите страницу «Поздравляем!» с взлетающей ракетой. Все получилось!

Смена порта

По умолчанию команда runserver запускает сервер разработки на внутреннем IP адресе с портом 8000.

Для смены порта передайте его аргументом в командной строке. Например, эта команда запускает сервер на порту 8080:

$ python manage.py runserver 8080
...\> py manage.py runserver 8080

Для изменения IP адреса сервера, передайте его вместе с портом. Например, чтобы использовать все доступные публичные IP-адреса (что полезно, если вы работаете с Vagrant или хотите показать свою работу на других компьютерах в сети), используйте:

$ python manage.py runserver 0.0.0.0:8000
...\> py manage.py runserver 0.0.0.0:8000

Полную документацию по серверу разработки можно найти в справке runserver.

Автоматическая перезагрузка runserver

Сервер разработки автоматически перезагружает код Python для каждого запроса по мере необходимости. Вам не нужно перезагружать сервер, чтобы изменения в коде вступили в силу. Однако некоторые действия, такие как добавление файлов, в эти условия не входят, поэтому вам придется перезапустить сервер в этих случаях.

Создание приложения Polls

Теперь, когда ваше окружение - «проект» - настроено, вы можете приступить к дальнейшей работе.

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

Проекты и приложения

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

Ваши приложения могут находиться где угодно в вашем пути Python. В этом руководстве мы создадим наше приложение для опроса в том же каталоге, что и ваш файл manage.py, чтобы его можно было импортировать как отдельный модуль верхнего уровня, а не как подмодуль mysite.

Чтобы создать приложение, убедитесь, что вы находитесь в том же каталоге, что и manage.py, и введите следующую команду:

$ python manage.py startapp polls
...\> py manage.py startapp polls

В результате будет создан каталог polls, который располагается следующим образом:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

В этой структуре каталогов будет размещено приложение опроса.

Написание первого отображения

Давайте напишем первое представление (view). Откройте файл polls/views.py и вставьте в него следующий код Python:

polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

Это самое простое представление, возможное в Django. Чтобы вызвать представление, нам нужно сопоставить его с URL - и для этого нам нужен URLconf.

Для создания URLconf в каталоге polls создайте файл с именем urls.py. Теперь каталог вашего приложения должен выглядеть следующим образом:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

В файл polls/urls.py добавьте следующий код:

polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

Следующим шагом является указание корневого URLconf на модуль polls.urls. В mysite/urls.py добавьте импорт django.urls.include и вставьте include() в список` urlpatterns`, у вас должно получиться так:

mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

Функция include() позволяет ссылаться на другие URLconfs. Всякий раз, когда Django встречает include(), он отсекает любую часть URL-адреса, совпадающую с этой точкой, и отправляет оставшуюся строку во включенный URLconf для дальнейшей обработки.

Идея, стоящая за include(), состоит в том, чтобы упростить добавление и воспроизведение URL-адресов. Так как опросы находятся в их собственном URLconf(polls/urls.py), их можно поместить в «/polls/», или в «/fun_polls/», или в «/content/polls/», или по любому другому корневому пути, и приложение все равно будет работать.

Когда использовать include()

Вы всегда должны использовать include() при включении других шаблонов URL. admin.site.urls - единственное исключение из этого.

Теперь вы подключили представление index к URLconf. Убедитесь, что он работает с помощью следующей команды:

$ python manage.py runserver
...\> py manage.py runserver

Перейдя в браузере по адресу http://localhost:8000/polls/, вы должны увидеть текст «Hello, world. You’re at the polls index.», который вы определили в представлении index.

Страница не найдена?

Если вы получили страницу с ошибкой, убедитесь, что переходите на http://localhost:8000/polls/, а не на http://localhost:8000/.

Функция path() передает четыре аргумента, два обязательных: route и view, и два необязательных: kwargs и name. На данный момент стоит рассмотреть, для чего эти аргументы.

path(), аргумент route

route - строка, содержащая шаблон URL. При обработке запроса Django начинается с первого шаблона в urlpatterns и пробирается вниз по списку, сравнивая запрошенный URL с каждым шаблоном, пока не найдет тот, который соответствует.

Шаблоны не выполняют поиск параметров GET и POST или имени домена. Например, в запросе к https://www.example.com/myapp/, URLconf будет искать myapp/. В запросе к https://www.example.com/myapp/?Page=3, URLconf также будет искать только myapp/.

path(), аргумент view

Когда Django находит соответствующий шаблон, он вызывает указанную функцию представления с объектом HttpRequest в качестве первого аргумента и любые «захваченные» значения из маршрута в качестве аргументов ключевого слова. Мы приведем пример этого чуть позже.

path(), аргумент kwargs

Произвольные ключевые аргументы могут быть переданы в словаре в целевое представление. Мы не собираемся использовать эту функцию Django в этом уроке.

path(), аргумент name

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

Когда вы освоитесь с основами запросов и ответов, прочитайте вторую часть этого руководства, чтобы начать работу с базой данных.

Вернуться на верх