Создание базового приложения для опросов

Advanced

Введение

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

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня продвинутый с процентом завершения 29%. Он получил 100% положительных отзывов от учащихся.

Обзор

Пусть мы будем учиться на примерах.

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

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

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

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

python -m django --version

Если Django установлен, вы увидите версию вашей установки. Если нет, вы получите ошибку с текстом "No module named django".

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

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

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

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

cd ~/project
django-admin startproject mysite

Это создаст директорию mysite в текущей директории.

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

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

Эти файлы следующие:

  • Внешняя директория mysite/ является контейнером для вашего проекта. Его имя не имеет значения для Django; вы можете переименовать его в любое другое.
  • manage.py: утилита командной строки, которая позволяет вам взаимодействовать с этим проектом Django различными способами.
  • Внутренняя директория mysite/ является фактическим пакетом Python для вашего проекта. Его имя является именем пакета Python, которое вы будете использовать для импорта любых элементов внутри него (например, mysite.urls).
  • mysite/__init__.py: пустой файл, который сообщает Python, что данная директория должна рассматриваться как пакет Python.
  • mysite/settings.py: настройки/конфигурация для этого проекта Django.
  • mysite/urls.py: объявления URL для этого проекта Django; "содержание" вашего сайта, работающего на Django.
  • mysite/asgi.py: точка входа для ASGI-совместимых веб-серверов для обслуживания вашего проекта.
  • mysite/wsgi.py: точка входа для WSGI-совместимых веб-серверов для обслуживания вашего проекта.

Разработка сервера

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

cd ~/project/mysite
python 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.

- 15:50:53 Django version, 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/ в вашем веб-браузере. Или выполните curl 127.0.0.1:8000 в терминале. Вы увидите страницу "Поздравляем!", на которой ракета взлетает. Все работает!

В LabEx VM необходимо добавить домен LabEx в ALLOWED_HOSTS. Откройте mysite/settings.py и добавьте * в конец ALLOWED_HOSTS, чтобы он выглядел так:

ALLOWED_HOSTS = ["*"]

Это говорит Django, что ему разрешается обслуживать запросы с любым заголовком хоста.

Django development server running

Изменение порта

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

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

python manage.py runserver 8080

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

python manage.py runserver 0.0.0.0:8080

Теперь переключитесь на вкладку Web 8080 в LabEx VM и вы увидите ту же страницу "Поздравляем".

Django development server page

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

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

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

Теперь, когда ваша среда (проект) настроена, вы можете приступить к работе.

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

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

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

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

cd ~/project/mysite
python manage.py startapp polls

Это создаст директорию polls, которая имеет следующую структуру:

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

Такая структура директорий будет содержать приложение для опросов.

Напишите ваше первое представление

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

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 включите следующий код:

from django.urls import path

from. import views

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

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

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

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

Функция ~django.urls.include позволяет ссылаться на другие URLconf.每当 Django 遇到~django.urls.include时,它会切掉到该点为止匹配的 URL 的任何部分,并将剩余的字符串发送到包含的 URLconf 进行进一步处理。

~django.urls.include背后的想法是使 URL 的即插即用变得容易。由于投票在自己的 URLconf(polls/urls.py)中,它们可以放在“/polls/”下,或“/fun_polls/”下,或“/content/polls/”下,或任何其他路径根目录下,应用程序仍然可以正常工作。

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

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

python manage.py runserver 0.0.0.0:8080

Перейдите в браузере по адресу <http:///polls/>, и вы должны увидеть текст "Hello, world. You're at the polls index.", который вы определили в представлении index.

Django URLconf structure

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

Аргумент ~django.urls.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/.

Аргумент ~django.urls.path: view

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

Аргумент ~django.urls.path: kwargs

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

Аргумент ~django.urls.path: name

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

Резюме

Поздравляем! Вы завершили лабораторную работу по созданию базового приложения для опросов. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.