- PVSM.RU - https://www.pvsm.ru -

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 1

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

В Proglib собрали небольшой шаблон, на базе которого можно создать свой блог на Django, а после — задеплоить на виртуальный сервер [1]. Материал будет полезен новичкам, которые знакомы с базовыми концепциями фреймворка и хотят закрепить знания. Подробности под катом!

Разделяй и властвуй


Нам предстоит собрать и запустить довольно большой проект, поэтому мы решили разделить материал на две статьи. В этой части сделаем обзор шаблона, в котором реализована основная функциональность платформы, и покажем, как выбрать хостинг [2]. В следующей — как развернуть веб-приложение с помощью Nginx и Gunicorn. Что из этого получится, можно посмотреть по ссылке [3].

Исходный код проекта находится в репозитории [4]. Делайте форк и предлагайте свои улучшения!

Используйте навигацию, если не хотите читать статью полностью:

Структура и функционал проекта

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 2

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

  • users [10] — аутентификация, авторизация, создание и редактирование профилей. Подписка на блоги, мессенджер, обработка контактной формы, поиск пользователей по интересам и ключевым словам.
  • blog [11] — создание, редактирование и удаление записей. Лайки, закладки, рекомендации, комментарии, сортировка записей по категориям и тегам. Поиск по ключевым словам в записях пользователей.
  • polls [12] — проведение опросов и голосований. Визуализация реализована с помощью библиотеки Chart.js.
  • quizzes [13] — модуль для создания и проведения тестов. Поддерживаются два типа вопросов — с единственным правильным и несколькими ответами.

Инициализируем проект


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

python -m venv blogitvenv
cd blogit
venvscriptsactivate

Установить зависимости можно с помощью requirements.txt — он содержит список необходимых модулей. Файл доступен по ссылке [14].

pip install -r requirements.txt

Вместе со всеми модулями pip подтягивает основной — django. Теперь можно создать проект.

django-admin startproject config .

Точка в конце команды нужна, чтобы директория проекта config и управляющий скрипт manage.py [15] находились на одном уровне с директориями приложений.

Каждое приложение будет содержать внутри своей директории набор html-шаблонов, которые будет возвращать Django в ответ на сетевые запросы. Но также есть несколько базовых и универсальных шаблонов, к которым должны иметь доступ все приложения — они расположены в папке templates внутри корневой директории проекта:

  • base.html [16] — базовый шаблон проекта, в котором подключаются статические файлы, иконки и внешние скрипты.
  • delete_template [17].html [17] — удаление объектов (записей, интересов и так далее).
  • landing.html [18] — главная страница платформы, которая видна только неавторизованным пользователям.
  • navbar.html [19] — меню с разделами сайта.
  • pagination.html [20] — универсальный шаблон для постраничного вывода любых объектов – от профилей и записей до опросов и тестов.
  • socials.html [21] — ссылки на аккаунты в соцсетях.
  • tags_categories [22].html [22] — вывод тегов и категорий записей.

Приложение users

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 3

В приложении users сосредоточена вся функциональность, связанная с созданием и обслуживанием пользовательских профилей. Чтобы его создать, нужно запустить управляющий скрипт с соответствующими параметрами.

manage.py startapp users

Также важно зарегистрировать новое приложение в корневой директории проекта, в конфигурационном файле settings.py.

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 4

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

path('', include('users.urls'))

Собственные маршруты приложения users будут храниться в файле users/urls.py — их можно найти и модифицировать по ссылке [23].

Шаблоны users расположены в отдельной директории — users/templates/users [24]:

  • account.html [25] — загружает собственный профиль авторизованного пользователя для редактирования.
  • friends.html [26] — выводит карточки с профилями друзей пользователя.
  • inbox.html [27] — страница с входящими сообщениями.
  • interest_form [28].html [28] — добавление нового интереса.
  • login_register [29].html [29] — регистрация / вход на сайт.
  • message.html [30] — вывод текста полученного сообщения.
  • message_form [31].html [31] — создание нового сообщения.
  • profile_form [32].html [32] — форма для добавления дополнительной информации, на которую пользователь перенаправляется сразу после регистрации.
  • profiles.html [33] — вывод профилей всех зарегистрированных пользователей с возможностью поиска по именам, интересам и ключевым словам в тексте «Обо мне».
  • user-profile.html [34] — просмотр профиля любого пользователя.

Вся логика для создания, редактирования и удаления профилей находится в signals.py [35]. В файле utils.py [36] расположены функции для пагинации и поиска по профилям. Обратите внимание, что система поиска игнорирует профиль авторизованного пользователя, а функция пагинации является универсальной: она используется в других приложения блога для постраничного вывода записей, тестов и опросов. В файле users/forms.py [37] расположены формы для регистрации и редактирования профиля, создания интересов и сообщений.

Модели в файле users/models.py [38] описывают таблицы базы данных, которые связаны с хранением пользовательских профилей, интересов и сообщений. Слаги [39] для интересов создаются автоматически: для транслитерации кириллицы используется функция slugify из модуля pytils.translit.

Функции представления users описаны в users/views.py [40] — они обеспечивают:

  • регистрацию, аутентификацию и авторизацию пользователей,
  • добавление пользователей в друзья (и удаление из друзей),
  • создание и отправку сообщений,
  • редактирование профиля и интересов,
  • сортировку профилей по определенному интересу,
  • отправку сообщения из контактной формы с помощью SMTP.

Приложение blog

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 5

После добавления пользовательского функционала можно перейти к основному приложению — blog. Аналогичным образом создаем его, регистрируем в settings.py и инициализируем в urls.py корневой директории. Маршруты самого блога находятся в blog/urls.py [41], а шаблоны — в blog/templates/blog [42].

  • my-blog.html [43] — шаблон для отображения собственного блога авторизованного пользователя.
  • post_footer [44].html [44] — футер поста для вывода количества лайков, закладок и комментариев.
  • post_form.html [45] — шаблон с формой добавления новой записи.
  • post_list.html [46] — «френдлента» и вывод записей по категориям и тегам.
  • single-post.html [47] — вывод отдельного поста с комментариями.
  • user-blog.html [48] — вывод блога любого пользователя.

Во время создания и редактирования записи пользователи могут выбирать существующие теги или добавлять новые: слаги для тегов создаются автоматически с помощью ранее упомянутого модуля pytils.translit. Метод генерации слагов get_unique_slug() для записей класса Post обеспечивает уникальность ссылок: если подобный слаг уже существует, к новому будет добавлен соответствующий порядковый номер:

    def get_unique_slug(self):
        slug = slugify(self.title)
        unique_slug = slug
        num = 1
        while Post.objects.filter(slug=unique_slug).exists():
            unique_slug = f"{slug}{num}"
            num += 1
        return unique_slug

Функция генерации уникального слага.

У класса Post есть и другие полезные методы:

  • number_of_likes() — возвращает число лайков.
  • number_of_bookmarks() — подсчитывает, сколько раз пользователи добавили запись в закладки.
  • number_of_comments() — определяет число одобренных и опубликованных комментариев. За одобрение комментариев отвечает метод approve() класса Comment.

Вся логика блога описана в blog/views.py [49]. Функции представления отвечают за:

  • добавление и удаление лайков и закладок,
  • сортировку записей по тегам и категориям,
  • вывод записей, добавленных в избранное, или отмеченных лайком,
  • постраничный вывод записей и поиск по ключевым словам. Сам поиск записей реализован с помощью модуля Django Q — соответствующая функция описана в blog/utils.py [50].

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 6

Тестовый запуск блога на сервере


Супер — большая часть функциональности уже готова. Можно загрузить код на сервер и протестировать работу приложения в продакшн-среде. Так оно будет доступно 24/7 вне зависимости от того, включена локальная машина или нет.

На первых порах, когда пользователей у проекта еще мало, будет достаточно виртуального сервера с гибкой производительностью ядра [1]. Для этого регистрируемся и входим в панель управления my.selectel.ru. Переходим в раздел Облачная платформа и выбираем Серверы.

Создаем сервер и настраиваем конфигурацию. Минимальный вариант — 20% vCPU, 1 ГБ ОЗУ, базовый SSD-диск на 5 ГБ и Ubuntu в качестве операционной системы. С учетом публичного IP-адреса такая конфигурация выйдет примерно 25 рублей в день.

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 7

Подготовка операционной системы и окружения

Для начала обновим Ubuntu, установим Git, Python, Nginx, файервол и вспомогательный пакет python3-dev. А также создадим виртуальное окружение и активируем его.

sudo apt upgrade
sudo apt install git ufw python3-pip python3-dev nginx
sudo apt install python3-venv
python3 -m venv blogitenv
source blogitenv/bin/activate

Теперь клонируем репозиторий [4], предварительно загруженный на GitHub, и установим необходимые зависимости.

git clone 
cd blogit
pip install -r requirements.txt

Далее нужно перейти в settings.py и установить значение False для параметра DEBUG. А в ALLOWED_HOSTS — добавить локальный и публичный адреса сервера, по которым будет доступен блог. Также не забудьте изменить значение SECRET_KEY и проверить конфигурации, которые используют приложения.

DEBUG = False
ALLOWED_HOSTS = ['94.26.224.162', 'localhost']

/root/blogit/config/settings.py

Настройка проекта и запуск

Теперь можно создать базу данных, аккаунт суперпользователя/администратора и собрать статические файлы в папку static, откуда их позже будет раздавать Nginx.

python3 manage.py migrate
python3 manage.py createsuperuser
python3 manage.py collectstatic

Пора проверить, как прошла установка приложения. Для этого запустим проект на нативном веб-сервере Django со специальным параметром --insecure, который позволяет фреймворку раздавать статические файлы в режиме DEBUG = False.

python3 manage.py runserver 0.0.0.0:8000 --insecure

Готово — сайт доступен из интернета по адресу http://94.26.224.162:8000 [51].

Создаем блог на Django с опросами и тестами. Краткая инструкция. Часть 1 - 8

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

Возможно, эти тексты тоже вас заинтересуют:

Простая процедурная генерация мира, или Шумы Перлина на Python [52]
«Карманный синоптик за час». Пишем Telegram-бота для мониторинга погоды на Python [53]
Проверяем ветхозаветную историю происхождения человечества от Адама и Евы с помощью популяционной модели [54]

Автор:
Seleditor

Источник [55]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/384794

Ссылки в тексте:

[1] виртуальный сервер: https://selectel.ru/services/cloud/servers/?utm_source=habr.com&utm_medium=referral&utm_campaign=cloud_article_Django_170523_content

[2] хостинг: https://www.reg.ru/?rlink=reflink-717

[3] ссылке: http://94.26.224.162/

[4] репозитории: https://github.com/natkaida/blogit

[5] Структура и функционал проекта: #1

[6] Инициализируем проект: #2

[7] Приложение users: #3

[8] Приложение blog: #4

[9] Тестовый запуск блога на сервере: #5

[10] users: https://github.com/natkaida/blogit/tree/main/users

[11] blog: https://github.com/natkaida/blogit/tree/main/blog

[12] polls: https://github.com/natkaida/blogit/tree/main/polls

[13] quizzes: https://github.com/natkaida/blogit/tree/main/quizzes

[14] ссылке: https://github.com/natkaida/blogit/blob/main/requirements.txt

[15] manage.py: https://docs.djangoproject.com/en/4.2/ref/django-admin/

[16] base.html: https://github.com/natkaida/blogit/blob/main/templates/base.html

[17] delete_template: https://github.com/natkaida/blogit/blob/main/templates/delete_template.html

[18] landing.html: https://github.com/natkaida/blogit/blob/main/templates/landing.html

[19] navbar.html: https://github.com/natkaida/blogit/blob/main/templates/navbar.html

[20] pagination.html: https://github.com/natkaida/blogit/blob/main/templates/pagination.html

[21] socials.html: https://github.com/natkaida/blogit/blob/main/templates/socials.html

[22] tags_categories: https://github.com/natkaida/blogit/blob/main/templates/tags_categories.html

[23] ссылке: https://github.com/natkaida/blogit/blob/main/users/urls.py

[24] users/templates/users: https://github.com/natkaida/blogit/tree/main/users/templates/users

[25] account.html: https://github.com/natkaida/blogit/blob/main/users/templates/users/account.html

[26] friends.html: https://github.com/natkaida/blogit/blob/main/users/templates/users/friends.html

[27] inbox.html: https://github.com/natkaida/blogit/blob/main/users/templates/users/inbox.html

[28] interest_form: https://github.com/natkaida/blogit/blob/main/users/templates/users/interest_form.html

[29] login_register: https://github.com/natkaida/blogit/blob/main/users/templates/users/login_register.html

[30] message.html: https://github.com/natkaida/blogit/blob/main/users/templates/users/message.html

[31] message_form: https://github.com/natkaida/blogit/blob/main/users/templates/users/message_form.html

[32] profile_form: https://github.com/natkaida/blogit/blob/main/users/templates/users/profile_form.html

[33] profiles.html: https://github.com/natkaida/blogit/blob/main/users/templates/users/profiles.html

[34] user-profile.html: https://github.com/natkaida/blogit/blob/main/users/templates/users/user-profile.html

[35] signals.py: https://github.com/natkaida/blogit/blob/main/users/signals.py

[36] utils.py: https://github.com/natkaida/blogit/blob/main/users/utils.py

[37] users/forms.py: https://github.com/natkaida/blogit/blob/main/users/forms.py

[38] users/models.py: https://github.com/natkaida/blogit/blob/main/users/models.py

[39] Слаги: https://www.youtube.com/watch?v%3DQe8YI5wXJng

[40] users/views.py: https://github.com/natkaida/blogit/blob/main/users/views.py

[41] blog/urls.py: https://github.com/natkaida/blogit/blob/main/blog/urls.py

[42] blog/templates/blog: https://github.com/natkaida/blogit/tree/main/blog/templates/blog

[43] my-blog.html: https://github.com/natkaida/blogit/blob/main/blog/templates/blog/my-blog.html

[44] post_footer: https://github.com/natkaida/blogit/blob/main/blog/templates/blog/post_footer.html

[45] post_form.html: https://github.com/natkaida/blogit/blob/main/blog/templates/blog/post_form.html

[46] post_list.html: https://github.com/natkaida/blogit/blob/main/blog/templates/blog/post_list.html

[47] single-post.html: https://github.com/natkaida/blogit/blob/main/blog/templates/blog/single-post.html

[48] user-blog.html: https://github.com/natkaida/blogit/blob/main/blog/templates/blog/user-blog.html

[49] blog/views.py: https://github.com/natkaida/blogit/blob/main/blog/views.py

[50] blog/utils.py: https://github.com/natkaida/blogit/blob/main/blog/utils.py

[51] http://94.26.224.162:8000: http://94.26.224.162:8000

[52] Простая процедурная генерация мира, или Шумы Перлина на Python: https://habr.com/ru/companies/selectel/articles/731506/

[53] «Карманный синоптик за час». Пишем Telegram-бота для мониторинга погоды на Python: https://habr.com/ru/companies/selectel/articles/734194/

[54] Проверяем ветхозаветную историю происхождения человечества от Адама и Евы с помощью популяционной модели: https://habr.com/ru/companies/selectel/articles/729828/

[55] Источник: https://habr.com/ru/companies/selectel/articles/735556/?utm_source=habrahabr&utm_medium=rss&utm_campaign=735556