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

Самый действенный способ изучить фреймворк — написать пет-проект. Например, свою социальную платформу на Django. Во время реализации можно попрактиковаться в работе с формами, представлениями, сигналами и SMTP.
В Proglib собрали небольшой шаблон, на базе которого можно создать свой блог на Django, а после — задеплоить на виртуальный сервер [1]. Материал будет полезен новичкам, которые знакомы с базовыми концепциями фреймворка и хотят закрепить знания. Подробности под катом!
Нам предстоит собрать и запустить довольно большой проект, поэтому мы решили разделить материал на две статьи. В этой части сделаем обзор шаблона, в котором реализована основная функциональность платформы, и покажем, как выбрать . В следующей — как развернуть веб-приложение с помощью Nginx и Gunicorn. Что из этого получится, можно посмотреть по ссылке [3].
Исходный код проекта находится в репозитории [4]. Делайте форк и предлагайте свои улучшения!
Используйте навигацию, если не хотите читать статью полностью:

На этапе проектирования важно разбить проект на самостоятельные приложения. Базово в блоге есть сервисы для аутентификации и авторизации, управления записями, опросами и тестами. Итого четыре приложения:
Начнем с самого простого: создадим виртуальное окружение, установим необходимые зависимости для среды разработки и инициализируем проект.
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 внутри корневой директории проекта:

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

Чтобы пользователь мог подключиться к приложению, нужно настроить маршрутизацию — перейти в корневую директорию проекта и зарегистрировать пути в конфигурационном файле urls.py.
path('', include('users.urls'))
Собственные маршруты приложения users будут храниться в файле users/urls.py — их можно найти и модифицировать по ссылке [23].
Шаблоны users расположены в отдельной директории — users/templates/users [24]:
Вся логика для создания, редактирования и удаления профилей находится в signals.py [35]. В файле utils.py [36] расположены функции для пагинации и поиска по профилям. Обратите внимание, что система поиска игнорирует профиль авторизованного пользователя, а функция пагинации является универсальной: она используется в других приложения блога для постраничного вывода записей, тестов и опросов. В файле users/forms.py [37] расположены формы для регистрации и редактирования профиля, создания интересов и сообщений.
Модели в файле users/models.py [38] описывают таблицы базы данных, которые связаны с хранением пользовательских профилей, интересов и сообщений. Слаги [39] для интересов создаются автоматически: для транслитерации кириллицы используется функция slugify из модуля pytils.translit.
Функции представления users описаны в users/views.py [40] — они обеспечивают:

После добавления пользовательского функционала можно перейти к основному приложению — blog. Аналогичным образом создаем его, регистрируем в settings.py и инициализируем в urls.py корневой директории. Маршруты самого блога находятся в blog/urls.py [41], а шаблоны — в blog/templates/blog [42].
Во время создания и редактирования записи пользователи могут выбирать существующие теги или добавлять новые: слаги для тегов создаются автоматически с помощью ранее упомянутого модуля 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]. Функции представления отвечают за:

Супер — большая часть функциональности уже готова. Можно загрузить код на сервер и протестировать работу приложения в продакшн-среде. Так оно будет доступно 24/7 вне зависимости от того, включена локальная машина или нет.
На первых порах, когда пользователей у проекта еще мало, будет достаточно виртуального сервера с гибкой производительностью ядра [1]. Для этого регистрируемся и входим в панель управления my.selectel.ru. Переходим в раздел Облачная платформа и выбираем Серверы.
Создаем сервер и настраиваем конфигурацию. Минимальный вариант — 20% vCPU, 1 ГБ ОЗУ, базовый SSD-диск на 5 ГБ и Ubuntu в качестве операционной системы. С учетом публичного IP-адреса такая конфигурация выйдет примерно 25 рублей в день.

Для начала обновим 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 предназначен только для тестирования и запуска веб-приложений во время разработки. Для обработки запросов в продакшене нужен 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
Нажмите здесь для печати.