Django 29.2 Добавляем поиск на сайт, продолжение
Форма поиска.
Напишем форму поиска. Для этого в директории приложения создадим новый файл
Внутри файла создадим класс
Пропишем поле
Ниже напишем метод
Код формы:
Форма поиска.
Напишем форму поиска. Для этого в директории приложения создадим новый файл
forms.py. Внутри файла создадим класс
SearchForm унаследованный от forms.Form.Пропишем поле
query. Поле будет являться символьным полем с максимальной длинной в 100 символов.Ниже напишем метод
clean_query. Данный метод будет очищать поисковый запрос от лишних пробелов внутри строки.Код формы:
from django import forms
class SearchForm(forms.Form):
query = forms.CharField(max_length=100,
widget=forms.TextInput(
attrs={
'class': 'form-control me-2 mx-1',
'placeholder': 'Что ищем?',
}
))
def clean_query(self):
query = self.cleaned_data['query']
cleaned_query = " ".join(query.split())
return cleaned_query
🔥1
Собственный менеджер для постов.
Нам также понадобится собственный менеджер, возвращающий только опубликованные посты.
Откроем файл
Внутри класса переопределим метод
Код менеджера:
Далее найдём модель поста и добавим новое поле, определяющее нашего менеджера -
Контекстный процессор формы поиска.
Для того чтобы форма поиска была доступна на всех страницах, её удобнее всего передавать через контекстные процессоры.
Откроем или создадим файл, если у вас его нет,
В файле напишем функцию
В теле функции сразу пишем возврат словаря, в котором будет ключ
Код:
Далее необходимо зарегистрировать функцию. Открываем файл
В ней находим список
Также не уходя из файла, в переменную
URL-маршрут для страницы поиска.
Откроем файл
Указывая по какому адресу будет открываться поиск, какое представление за него отвечает и какое имя будет у маршрута.
Блок поиска в шапке сайта.
Для добавления поиска в шапку сайта, откройте файл
Исправление пагинации для работы с поиском.
Поскольку у нас в запросе кроме номера страницы, ещё и переменная с поисковым запросом, стандартная пагинация работать не будет. Но исправление проблемы максимально простое.
Откроем файл
Например, так было:
А так должно быть:
Шаблон страницы поиска.
В шаблоне будем выводить поисковый запрос пользователя, результаты поиска и пагинацию.
Нам также понадобится собственный менеджер, возвращающий только опубликованные посты.
Откроем файл
models.py и после импортов создадим класс PostManager унаследованный от models.Manager.Внутри класса переопределим метод
get_queryset.Код менеджера:
class PostManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status=PostModel.Status.PUBLISHED)
Далее найдём модель поста и добавим новое поле, определяющее нашего менеджера -
post_manager = PostManager()Контекстный процессор формы поиска.
Для того чтобы форма поиска была доступна на всех страницах, её удобнее всего передавать через контекстные процессоры.
Откроем или создадим файл, если у вас его нет,
context_processors.py.В файле напишем функцию
get_search_form принимающую request. В теле функции сразу пишем возврат словаря, в котором будет ключ
search_form, а значением форма.Код:
from blog import forms
def get_search_form(request):
return {'search_form': forms.SearchForm()}
Далее необходимо зарегистрировать функцию. Открываем файл
settings.py и находим переменную TEMPLATES.В ней находим список
context_processors и в него дописываем функцию - 'blog.context_processors.get_search_form',Также не уходя из файла, в переменную
INSTALLED_APPS добавим строку - 'django.contrib.postgres',.URL-маршрут для страницы поиска.
Откроем файл
urls.py приложения и добавим новую строку:path('search/', views.SearchPageView.as_view(), name='search_page'),Указывая по какому адресу будет открываться поиск, какое представление за него отвечает и какое имя будет у маршрута.
Блок поиска в шапке сайта.
Для добавления поиска в шапку сайта, откройте файл
header.html и пропишите в удобном для вас месте следующий код:<li class="nav-item">
<form class="d-flex" method="GET" action="{% url 'blog:search_page' %}">
{{ search_form.query }}
<button class="btn btn-primary search-btn" type="submit">Поиск</button>
</form>
</li>
Исправление пагинации для работы с поиском.
Поскольку у нас в запросе кроме номера страницы, ещё и переменная с поисковым запросом, стандартная пагинация работать не будет. Но исправление проблемы максимально простое.
Откроем файл
pagination.html и к каждой ссылке добавим проверку на наличие переменной query. Если она есть, то в адрес добавляется переменная с запросом.Например, так было:
<li class="page-item"><a class="page-link" href="?page={{ num_page }}">{{ num_page }}</a></li>А так должно быть:
<li class="page-item"><a class="page-link" href="?page={{ num_page }}{% if request.GET.query %}&query={{ request.GET.query }}{% endif %}">{{ num_page }}</a></li>Шаблон страницы поиска.
В шаблоне будем выводить поисковый запрос пользователя, результаты поиска и пагинацию.
Код шаблона:
Файлы к посту, можно получить в боте по коду: 159845
Пост на сайте.
Поддержать канал.
{% extends "blog/base.html" %}
{% block title %}{{ query }}{% endblock %}
{% block content %}
<section class="info">
<div class="container">
<h1>Результаты по запросу: {{ query }}</h1>
<hr> </div> </section>
<section class="posts">
{% if results %}
<div class="container">
<div class="row">
<div class="col-lg-9 col-sm-12 cat-block">
{% for post in results %}
<div class="row">
<div class="col-lg-4 col-sm-12 d-flex align-items-center">
<img src="{{ post.image.url }}" alt="{{ post.title }}" class="img-fluid">
</div> <div class="col-lg-8 col-sm-12">
<h2 class="head2"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
<div class="mb-3">
<p class="lead"><a
href="{{ post.category.get_absolute_url }}">{{ post.category }}</a>
| {{ post.author }} | {{ post.publish | date:"d F Y" }} |
Просмотров: {{ post.views }}</p>
{% for tag in post.tags.all %}
<a href="{% url 'blog:tag_page' tag.slug %}"><span
class="badge bg-secondary">{{ tag.name }}</span></a>
{% endfor %}
</div>
{{ post.short_body | safe }}
</div>
</div> <hr class="m-3">
{% endfor %}
</div>
<div class="col-lg-3 col-sm-12">
<h2 class="mb-3">Ссылки</h2>
{% block social_links %}
{% include 'blog/index_page/social_links.html' %}
{% endblock %}
</div>
</div> <div class="col-12">
{% include "blog/modules/pagination.html" with page_obj=results %}
</div>
</div> {% else %}
<div class="container">
<h3>Нет результатов</h3>
</div> {% endif %}
</section>
{% endblock %}
На этом всё. Действий много, но они всё "точечные". Теперь на сайте есть работающий поиск.Файлы к посту, можно получить в боте по коду: 159845
Пост на сайте.
Поддержать канал.
👍3
Полезные инструменты - Certbot - бесплатный SSL-сертификат для сайта
В настоящее время даже думать не стоит о запуске сайта без оснащённого SSL-сертификатом. Более того, в скором времени сайты работающие на HTTP вовсе перестанут открываться в браузерах без "танцев с бубном" и десятка подписей, что вы осознаёте все риски.
Самый простой способ получить SSL-сертификат, это его купить у хостинг-провайдера либо в специализированном центре сертификации.
Существуют разные виды сертификатов, различающиеся лишь "уровнем доверия". В кавычках, потому, что по большому счёту это "плата за воздух" и "бренд", но это отдельная тема для дискуссии.
Нас же интересует бесплатный сертификат
В настоящее время даже думать не стоит о запуске сайта без оснащённого SSL-сертификатом. Более того, в скором времени сайты работающие на HTTP вовсе перестанут открываться в браузерах без "танцев с бубном" и десятка подписей, что вы осознаёте все риски.
Самый простой способ получить SSL-сертификат, это его купить у хостинг-провайдера либо в специализированном центре сертификации.
Существуют разные виды сертификатов, различающиеся лишь "уровнем доверия". В кавычках, потому, что по большому счёту это "плата за воздух" и "бренд", но это отдельная тема для дискуссии.
Нас же интересует бесплатный сертификат
Let's Encrypt. Сертификат выдаётся на 3 месяца. Если у вас небольшой сайт или страничка PET-проекта, этого достаточно на первое время.👍1
Важно.
В данном посте будет показано получение сертификата на ОС Windows 11.
В качестве терминала используется PowerShell версии 7.3.6.
Настройки домена на примере хостинг-провайдера TimeWeb.
Пост по настройке на Linux с возможностью автопродления будет позже.
Что такое SSL-сертификат и для чего он нужен.
SSL-сертификат, или Secure Socket Layer, это цифровая подпись, подтверждающая подлинность веб-сайта и безопасное соединение между пользователем и сервером. SSL-сертификаты необходимы для сайтов, обрабатывающих конфиденциальную информацию, например, данные кредитных карт, личную информацию, данные аутентификации и так далее.
Он обеспечивает следующие функции:
- Шифрование данных: SSL-сертификаты шифруют информацию, передаваемую между пользователем и сайтом, обеспечивая защиту от перехвата и подмены данных.
- Идентификация сайта: SSL-сертификаты содержат информацию о домене, для которого они выданы, что позволяет браузеру убедиться в подлинности сайта.
- Установление безопасного соединения: SSL-сертификаты создают безопасное соединение между браузером пользователя и сервером сайта, защищая от атак “человек посередине”.
- Подпись кода: SSL-сертификаты могут использоваться для подписи исполняемого кода, чтобы подтвердить его подлинность и целостность.
Certbot.
Для получения сертификата будем использовать программу Certbot.
Certbot — это программа с открытым исходным кодом, предназначенная для получения и продления SSL-сертификатов для обеспечения безопасности и доверия на веб-сайтах. Она работает на платформах Linux, macOS и Windows и поддерживает широкий спектр центров сертификации, включая Let’s Encrypt и ACME. Certbot прост в использовании и автоматизирует весь процесс получения и обновления сертификатов.
Официальный сайт программы: https://certbot.eff.org/
Установка.
Необходимо скачать и установить программу.
Скачиваем по ссылке: https://github.com/certbot/certbot/releases/latest/download/certbot-beta-installer-win_amd64_signed.exe
И устанавливаем. Буквально далее-далее-финиш. В процессе можете изменить стандартный путь установки, если необходимо.
Проверить работоспособность можно в терминале введя команду:
В результате выполнения должна отобразиться строчка
В данном посте будет показано получение сертификата на ОС Windows 11.
В качестве терминала используется PowerShell версии 7.3.6.
Настройки домена на примере хостинг-провайдера TimeWeb.
Пост по настройке на Linux с возможностью автопродления будет позже.
Что такое SSL-сертификат и для чего он нужен.
SSL-сертификат, или Secure Socket Layer, это цифровая подпись, подтверждающая подлинность веб-сайта и безопасное соединение между пользователем и сервером. SSL-сертификаты необходимы для сайтов, обрабатывающих конфиденциальную информацию, например, данные кредитных карт, личную информацию, данные аутентификации и так далее.
Он обеспечивает следующие функции:
- Шифрование данных: SSL-сертификаты шифруют информацию, передаваемую между пользователем и сайтом, обеспечивая защиту от перехвата и подмены данных.
- Идентификация сайта: SSL-сертификаты содержат информацию о домене, для которого они выданы, что позволяет браузеру убедиться в подлинности сайта.
- Установление безопасного соединения: SSL-сертификаты создают безопасное соединение между браузером пользователя и сервером сайта, защищая от атак “человек посередине”.
- Подпись кода: SSL-сертификаты могут использоваться для подписи исполняемого кода, чтобы подтвердить его подлинность и целостность.
Certbot.
Для получения сертификата будем использовать программу Certbot.
Certbot — это программа с открытым исходным кодом, предназначенная для получения и продления SSL-сертификатов для обеспечения безопасности и доверия на веб-сайтах. Она работает на платформах Linux, macOS и Windows и поддерживает широкий спектр центров сертификации, включая Let’s Encrypt и ACME. Certbot прост в использовании и автоматизирует весь процесс получения и обновления сертификатов.
Официальный сайт программы: https://certbot.eff.org/
Установка.
Необходимо скачать и установить программу.
Скачиваем по ссылке: https://github.com/certbot/certbot/releases/latest/download/certbot-beta-installer-win_amd64_signed.exe
И устанавливаем. Буквально далее-далее-финиш. В процессе можете изменить стандартный путь установки, если необходимо.
Проверить работоспособность можно в терминале введя команду:
certbot --version.В результате выполнения должна отобразиться строчка
certbot 2.6.0. (актуальная на момент написания поста версия.)👍3
Получение сертификата.
Запускаем PowerShell от имени администратора. Это важно! Иначе сертификат невозможно будет сгенерировать!
И вводим следующую команду:
-
-
-
Выполняем. Далее нас попросят ввести домен или домены через пробел или запятую, к которым будет относиться сертификат. Принято вводить две версии домена, с www и без. Также я дополнительно введу и почтовый поддомен. Выходит такая строка:
Внимание! Есть ещё второй вариант добавления неограниченного количества поддоменов в сертификат. Для этого указываем два домена:
Однако, стоит отметить, что данный способ не указан в документации, гарантировать его работу не могу.
Нажимаем Enter и далее начнётся "испытание".
На этом этапе будьте предельно внимательны! Если вы ввели всего один домен, не спешите нажимать Enter после вывода задания, также, если вы ввели несколько доменов, не нажимайте Enter после вывода задания для последнего домена. Поскольку DNS запись обновляется не сразу. Об этом чуть ниже.
Для каждого введённого домена будет выведено имя хоста и текстовая запись, которые необходимо создать в панели управления вашим доменом.
На примере
Хост:
Необходимо создать TXT-запись.
Выбираем раздел "Домены", там необходимый домен, затем вкладку "DNS".
Нажимаем на кнопку "Добавить запись" и выбираем "TXT".
В разделе Хост выбираем "Ввести вручную" и вводим
В поле значение вводим:
И так делаем, пока не дойдём до последнего домена. Когда создадите запись для последнего домена, не спешите нажимать Enter. DNS-записи могут обновляться достаточно долго, до 24-х часов. Отслеживать добавилась запись к домену или нет, можно по ссылке указанной в тексте под кодом значения. Перейдя по ней, можно увидеть, есть запись у домена или ещё нет. Если есть, убедитесь, что и для других указанных доменов она тоже присутствует, нажимайте Enter.
Также стоит отметить, что до появления записи в DNS, терминал следует держать открытым, иначе придётся всё проделывать заново.
Если, всё выполнено верно и не было никаких ошибок, будет выведено последнее сообщение и завершится работа программы.
В последнем сообщении будет указано расположение файлов и дата окончания действия.
Пути расположения файлов:
Сертификат:
Поздравляю! Теперь у вас есть действующий сертификат для сайта, сроком на 3 месяца.
Файлы к посту, можно получить в боте по коду: 395898
Пост на сайте.
Поддержать канал.
Запускаем PowerShell от имени администратора. Это важно! Иначе сертификат невозможно будет сгенерировать!
И вводим следующую команду:
certbot certonly --authenticator manual --preferred-challenges dns
Параметры команды:-
certonly - указывает, что мы хотим получить только сертификат.-
--authenticator manual - указывает, что мы в ручном режиме предоставим доказательства владения доменом.-
--preferred-challenges dns - указывает, что в качестве подтверждения будет использоваться TXT-запись в DNS домена.Выполняем. Далее нас попросят ввести домен или домены через пробел или запятую, к которым будет относиться сертификат. Принято вводить две версии домена, с www и без. Также я дополнительно введу и почтовый поддомен. Выходит такая строка:
pressanybutton.ru www.pressanybutton.ru mail.pressanybutton.ru.Внимание! Есть ещё второй вариант добавления неограниченного количества поддоменов в сертификат. Для этого указываем два домена:
domain.ru и *.domain.ru. Это упростит получение сертификата, если у вас несколько поддоменов.Однако, стоит отметить, что данный способ не указан в документации, гарантировать его работу не могу.
Нажимаем Enter и далее начнётся "испытание".
На этом этапе будьте предельно внимательны! Если вы ввели всего один домен, не спешите нажимать Enter после вывода задания, также, если вы ввели несколько доменов, не нажимайте Enter после вывода задания для последнего домена. Поскольку DNS запись обновляется не сразу. Об этом чуть ниже.
Для каждого введённого домена будет выведено имя хоста и текстовая запись, которые необходимо создать в панели управления вашим доменом.
На примере
mail.pressanybutton.ru:Хост:
_acme-challenge.mail.pressanybutton.ru.
Значение: QkUdVKpxx1jbCin6Yf64l5IaKgJEYrgIG0iYYbNFTj4
Поскольку у меня три домена введено, то и три записи надо создать. На примере одной из них в панели управления TimeWeb:Необходимо создать TXT-запись.
Выбираем раздел "Домены", там необходимый домен, затем вкладку "DNS".
Нажимаем на кнопку "Добавить запись" и выбираем "TXT".
В разделе Хост выбираем "Ввести вручную" и вводим
_acme-challenge.mail.В поле значение вводим:
QkUdVKpxx1jbCin6Yf64l5IaKgJEYrgIG0iYYbNFTj4.И так делаем, пока не дойдём до последнего домена. Когда создадите запись для последнего домена, не спешите нажимать Enter. DNS-записи могут обновляться достаточно долго, до 24-х часов. Отслеживать добавилась запись к домену или нет, можно по ссылке указанной в тексте под кодом значения. Перейдя по ней, можно увидеть, есть запись у домена или ещё нет. Если есть, убедитесь, что и для других указанных доменов она тоже присутствует, нажимайте Enter.
Также стоит отметить, что до появления записи в DNS, терминал следует держать открытым, иначе придётся всё проделывать заново.
Если, всё выполнено верно и не было никаких ошибок, будет выведено последнее сообщение и завершится работа программы.
В последнем сообщении будет указано расположение файлов и дата окончания действия.
Пути расположения файлов:
Сертификат:
C:\Certbot\archive\pressanybutton.ru\fullchain.pem
Приватный ключ: C:\Certbot\archive\pressanybutton.ru\privkey.pem
В директории так же будет ещё два других сертификата, но их применение только в специализированных ситуациях. В качестве сертификата используйте только fullchain.pem.Поздравляю! Теперь у вас есть действующий сертификат для сайта, сроком на 3 месяца.
Файлы к посту, можно получить в боте по коду: 395898
Пост на сайте.
Поддержать канал.
👍2
Код на салфетке
Получение сертификата. Запускаем PowerShell от имени администратора. Это важно! Иначе сертификат невозможно будет сгенерировать! И вводим следующую команду: certbot certonly --authenticator manual --preferred-challenges dns Параметры команды: - certonly…
Дополнение к посту.
После небольшого спора о способе указания поддоменов в сертификат и проверке этого способа, в текст поста было добавлено следующее дополнение:
Внимание! Есть ещё второй вариант добавления неограниченного количества поддоменов в сертификат. Для этого указываем два домена:
Однако, стоит отметить, что данный способ не указан в документации, гарантировать его работу не могу.
Присоединяйтесь к чату, у нас весело и иногда интересно 😉
После небольшого спора о способе указания поддоменов в сертификат и проверке этого способа, в текст поста было добавлено следующее дополнение:
Внимание! Есть ещё второй вариант добавления неограниченного количества поддоменов в сертификат. Для этого указываем два домена:
domain.ru и *.domain.ru. Это упростит получение сертификата, если у вас несколько поддоменов.Однако, стоит отметить, что данный способ не указан в документации, гарантировать его работу не могу.
Присоединяйтесь к чату, у нас весело и иногда интересно 😉
👍2
Сегодня ровно 14 месяцев с начала обучения по годовой программе в GeekBrains.
Я выкладывал пост на 12й месяц, а про 13й забыл. Исправляюсь)
Обучение: тринадцатый месяц
Обучение: четырнадцатый месяц
😊Буду рад лайкам подпискам и вот этому всему)
Я выкладывал пост на 12й месяц, а про 13й забыл. Исправляюсь)
Обучение: тринадцатый месяц
Обучение: четырнадцатый месяц
😊Буду рад лайкам подпискам и вот этому всему)
🔥8
Приветствую!
Каналу уже три месяца!
За это время:
- Вышло 59 постов
- На канал подписалось 197 человек (как много!)
- В чате 32 участника и там постоянно, что-то творится
Каждый пост, это не просто, что я взял и написал. Зачастую это изучение материала, для того, что бы применить его самому и рассказать вам, как это сделать. Поэтому, посты могут быть не регулярными))
Хочу поблагодарить вас за то, что читаете, оставляете комментарии и общаетесь в чате.
Также особая благодарность поддерживающим на Boosty:
- Юрий Гаврилович за донат и подписку
- Сергей за донат
- Кристина за донат
Дальше больше и надеюсь лучше)
Спасибо!
Каналу уже три месяца!
За это время:
- Вышло 59 постов
- На канал подписалось 197 человек (как много!)
- В чате 32 участника и там постоянно, что-то творится
Каждый пост, это не просто, что я взял и написал. Зачастую это изучение материала, для того, что бы применить его самому и рассказать вам, как это сделать. Поэтому, посты могут быть не регулярными))
Хочу поблагодарить вас за то, что читаете, оставляете комментарии и общаетесь в чате.
Также особая благодарность поддерживающим на Boosty:
- Юрий Гаврилович за донат и подписку
- Сергей за донат
- Кристина за донат
Дальше больше и надеюсь лучше)
Спасибо!
🔥7
Docker 5.1 Почтовый сервер на Docker Mailserver - настройка домена
В посте "Django 12. Настройка отправки почты", я описывал как в Django можно настроить отправку почты используя обычный почтовый ящик и упоминал про возможность отправлять почту от имени домена используя специальные сервисы.
Поскольку меня не устраивали эти варианты, я начал изучать вопрос поднятия своего сервера для отправки/получения почты.
Решений нашлось не мало, от сборки своего сервера с нужными компонентами, до готовых комбайнов.
Сборка своего, даже из готовых компонентов, достаточно нетривиальная задача, требующая массу времени и знаний в этой области, оставим это Dev-ops инженерам и администраторам.
В посте "Django 12. Настройка отправки почты", я описывал как в Django можно настроить отправку почты используя обычный почтовый ящик и упоминал про возможность отправлять почту от имени домена используя специальные сервисы.
Поскольку меня не устраивали эти варианты, я начал изучать вопрос поднятия своего сервера для отправки/получения почты.
Решений нашлось не мало, от сборки своего сервера с нужными компонентами, до готовых комбайнов.
Сборка своего, даже из готовых компонентов, достаточно нетривиальная задача, требующая массу времени и знаний в этой области, оставим это Dev-ops инженерам и администраторам.
Выбор пал на готовые решения, но и тут не всё так просто. Есть масса вариантов, от совсем простеньких, до комбайнов, включающих в себя массу модулей и возможностей. Тут уже стоит исходить из потребностей, требуемых возможностей и, что немаловажно из системных требований решения. Поскольку в ресурсах я ограничен двумя Гигабайтами оперативной памяти на моём сервере, я выбрал в качестве почтового сервера -
Окружение.
Действия в данном посте подразумевают, что у вас имеется домен и доступ к управлению DNS-записями.
В следующем посте понадобится VPS-сервер и действующий SSL-сертификат.
Могу порекомендовать два хостинга:
- HSHP - достаточно дешевые сервера в Германии, отлично подойдут для тестов или, например, настроить собственный VPN.
- TimeWeb Cloud - наверное, самый надёжный хостинг из всех, что я пробовал. Также тут удобно приобретать или подключать свои домены.
(Ссылки реферальные - вам не сложно, а мне приятно, спасибо.)
Используемый сервер:
- CPU: 1x 3.3ГГц
- RAM: 2Гб
- SSD: 20Гб NVMe
- OS: Debian 12
Docker Mailserver.
Docker Mail Server, или DMS, представляет собой готовый к работе полнофункциональный, но простой почтовый сервер.
Ключевые особенности:
- Поддерживает протоколы SMTP, IMAP, POP3 и LDAP.
- Используются только файлы конфигурации, без базы данных SQL.
- Поддержка антиспам фильтра SpamAssassin и антивируса ClamAV.
Настройка домена.
Начнём с подготовки домена для правильной работы с почтой.
Нам необходимо добавить шесть записей к домену, а именно:
Вернее пять, поскольку
Для почты будем использовать поддомен mail.<имя_домена>. В моём случае это - mail.pressanybutton.ru, он же будет далее по тексту.
Необходимо его создать.
Все примеры будут на основе панели управления хостинга TimeWeb
PTR.
PTR (Pointer) - обратная запись ресурсов DNS. Она связывает IP-адрес с доменным именем, позволяя определить, какому домену принадлежит IP-адрес отправителя электронной почты.
Чаще всего данную запись нельзя установить из панели управления. Если такая возможность отсутствует у вашего хостинг-провайдера, то для установки вам необходимо обратиться в службу поддержки.
Установка на TimeWeb:
Открываем страницу "Облачные серверы" и выбираем vps, на котором будет располагаться почтовый сервер.
Выбираем вкладку "Сеть".
Там внизу находим IP-адрес сервера и нажимаем на шестерёнку. На открывшейся странице указываем доменное имя для почты.
MX.
MX (Mail eXchanger) - это записи ресурсов DNS, которые определяют серверы, принимающие почту для конкретного домена. MX-запись содержит приоритет и доменное имя сервера, который будет использоваться для обработки почты. Чем меньше числовое значение приоритета, тем выше приоритет сервера.
Установить запись можно в настройках DNS вашего хостинг-провайдера или у регистратора домена.
Запись должна быть вида:
Где 10 - это приоритет, а mail.pressanybutton.ru - почтовый домен.
Установка на TimeWeb(если домен приобретён или делегирован на сервера TimeWeb):
Открываем раздел "Домены". Выбираем нужный домен и переходим на вкладку DNS.
Если имеются mx-записи, удаляем. Затем нажимаем кнопку "Добавить запись" и выбираем MX.
Выбираем службу "Другое" и прописываем приоритет и почтовый домен.
То же самое делаем для поддомена.
Docker Mailserver. Окружение.
Действия в данном посте подразумевают, что у вас имеется домен и доступ к управлению DNS-записями.
В следующем посте понадобится VPS-сервер и действующий SSL-сертификат.
Могу порекомендовать два хостинга:
- HSHP - достаточно дешевые сервера в Германии, отлично подойдут для тестов или, например, настроить собственный VPN.
- TimeWeb Cloud - наверное, самый надёжный хостинг из всех, что я пробовал. Также тут удобно приобретать или подключать свои домены.
(Ссылки реферальные - вам не сложно, а мне приятно, спасибо.)
Используемый сервер:
- CPU: 1x 3.3ГГц
- RAM: 2Гб
- SSD: 20Гб NVMe
- OS: Debian 12
Docker Mailserver.
Docker Mail Server, или DMS, представляет собой готовый к работе полнофункциональный, но простой почтовый сервер.
Ключевые особенности:
- Поддерживает протоколы SMTP, IMAP, POP3 и LDAP.
- Используются только файлы конфигурации, без базы данных SQL.
- Поддержка антиспам фильтра SpamAssassin и антивируса ClamAV.
Настройка домена.
Начнём с подготовки домена для правильной работы с почтой.
Нам необходимо добавить шесть записей к домену, а именно:
MX, A, PTR, DKIM, DMARC, SPF.Вернее пять, поскольку
DKIM-запись будем добавлять на этапе запуска сервера.Для почты будем использовать поддомен mail.<имя_домена>. В моём случае это - mail.pressanybutton.ru, он же будет далее по тексту.
Необходимо его создать.
Все примеры будут на основе панели управления хостинга TimeWeb
PTR.
PTR (Pointer) - обратная запись ресурсов DNS. Она связывает IP-адрес с доменным именем, позволяя определить, какому домену принадлежит IP-адрес отправителя электронной почты.
Чаще всего данную запись нельзя установить из панели управления. Если такая возможность отсутствует у вашего хостинг-провайдера, то для установки вам необходимо обратиться в службу поддержки.
Установка на TimeWeb:
Открываем страницу "Облачные серверы" и выбираем vps, на котором будет располагаться почтовый сервер.
Выбираем вкладку "Сеть".
Там внизу находим IP-адрес сервера и нажимаем на шестерёнку. На открывшейся странице указываем доменное имя для почты.
MX.
MX (Mail eXchanger) - это записи ресурсов DNS, которые определяют серверы, принимающие почту для конкретного домена. MX-запись содержит приоритет и доменное имя сервера, который будет использоваться для обработки почты. Чем меньше числовое значение приоритета, тем выше приоритет сервера.
Установить запись можно в настройках DNS вашего хостинг-провайдера или у регистратора домена.
Запись должна быть вида:
10 mail.pressanybutton.ru.Где 10 - это приоритет, а mail.pressanybutton.ru - почтовый домен.
Установка на TimeWeb(если домен приобретён или делегирован на сервера TimeWeb):
Открываем раздел "Домены". Выбираем нужный домен и переходим на вкладку DNS.
Если имеются mx-записи, удаляем. Затем нажимаем кнопку "Добавить запись" и выбираем MX.
Выбираем службу "Другое" и прописываем приоритет и почтовый домен.
То же самое делаем для поддомена.
A.
A (Address) - запись ресурсов DNS, которая сопоставляет доменное имя с его IP-адресом. Она используется для определения местоположения сервера, на котором находится сайт или почтовый сервер.
Также прописываем и для поддомена.
Установка такая же как и для предыдущего пункта.
Отличия лишь в том, что мы выбираем вместо mx-записи - a-запись. В значении указываем IP-адрес сервера.
Для поддомена в TimeWeb, А-запись не создаём, запись будет создана автоматически.
DMARC.
DMARC (Domain-based Message Authentication, Reporting and Conformance) - стандарт, который позволяет доменам определять политики обработки сообщений, отправленных с поддельных адресов электронной почты. DMARC включает в себя три компонента: аутентификацию, отчетность и соответствие.
Необходимо создать TXT-запись.
Хост:
Значение:
Изменить адреса почты на ваши.
Установка на TimeWeb:
В том же разделе, что и ранее выбираем "Добавить запись" - "TXT".
В пункте "Хост" выбираем "Ввести вручную" и вводим
Значение вводим такое же, что указано выше.
SPF.
SPF (Sender Policy Framework) - механизм, который помогает определить, является ли домен, указанный в поле “от”, авторизованным для отправки электронной почты от имени этого домена. SPF-запись в DNS содержит список серверов, которые авторизованы для отправки почты от имени домена.
Необходимо отредактировать имеющуюся TXT-запись с spf-записью или добавить новую TXT-запись.
Если TXT-записи с spf нет:
Хостом выбираем основной домен
В поле значение вводим:
Если TXT-запись с spf есть:
Смотрим, что записано в поле значение, если там нет
У меня имелась запись:
Новая стала выглядеть так:
Установка на TimeWeb:
Так же как и в предыдущем пункте, только выбираем хостом основной домен и всё.
На этом подготовка домена закончена. В следующем посте будем запускать и настраивать сервер.
Файлы к посту, можно получить в боте по коду: 284512
Пост на сайте.
Поддержать канал.
A (Address) - запись ресурсов DNS, которая сопоставляет доменное имя с его IP-адресом. Она используется для определения местоположения сервера, на котором находится сайт или почтовый сервер.
Также прописываем и для поддомена.
Установка такая же как и для предыдущего пункта.
Отличия лишь в том, что мы выбираем вместо mx-записи - a-запись. В значении указываем IP-адрес сервера.
Для поддомена в TimeWeb, А-запись не создаём, запись будет создана автоматически.
DMARC.
DMARC (Domain-based Message Authentication, Reporting and Conformance) - стандарт, который позволяет доменам определять политики обработки сообщений, отправленных с поддельных адресов электронной почты. DMARC включает в себя три компонента: аутентификацию, отчетность и соответствие.
Необходимо создать TXT-запись.
Хост:
_dmarc.pressanybutton.ruЗначение:
v=DMARC1; p=quarantine; sp=quarantine; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400; rua=mailto:[email protected]; ruf=mailto:[email protected]Изменить адреса почты на ваши.
Установка на TimeWeb:
В том же разделе, что и ранее выбираем "Добавить запись" - "TXT".
В пункте "Хост" выбираем "Ввести вручную" и вводим
_dmarcЗначение вводим такое же, что указано выше.
SPF.
SPF (Sender Policy Framework) - механизм, который помогает определить, является ли домен, указанный в поле “от”, авторизованным для отправки электронной почты от имени этого домена. SPF-запись в DNS содержит список серверов, которые авторизованы для отправки почты от имени домена.
Необходимо отредактировать имеющуюся TXT-запись с spf-записью или добавить новую TXT-запись.
Если TXT-записи с spf нет:
Хостом выбираем основной домен
pressanybutton.ru.В поле значение вводим:
v=spf1 mx ~allЕсли TXT-запись с spf есть:
Смотрим, что записано в поле значение, если там нет
mx, добавляем через пробел после v=spf1, также если там нет ~all, то добавляем через пробел в самый конец.У меня имелась запись:
v=spf1 include:_spf.timeweb.ru ~allНовая стала выглядеть так:
v=spf1 mx include:_spf.timeweb.ru ~allУстановка на TimeWeb:
Так же как и в предыдущем пункте, только выбираем хостом основной домен и всё.
На этом подготовка домена закончена. В следующем посте будем запускать и настраивать сервер.
Файлы к посту, можно получить в боте по коду: 284512
Пост на сайте.
Поддержать канал.
🔥1
Тут меня вчера озадачили.
Поступило предложение, организовать к новому году "Тайного Санту". Кто не знает, что это - погуглите) Вопрос: хотели бы вы в этом поучаствовать?
Поступило предложение, организовать к новому году "Тайного Санту". Кто не знает, что это - погуглите) Вопрос: хотели бы вы в этом поучаствовать?
Anonymous Poll
34%
Да! С удовольствием)
38%
Выглядит интересно, но я только посмотреть
3%
Нет, плохая идея
25%
Вам делать совсем нечего?
Docker 5.2 Почтовый сервер на Docker Mailserver - настройка и запуск
В прошлом посте мы подготовили домен для работы с почтой, в этом мы запустим почтовый сервер.
Запускать почтовый сервер будем в Docker-контейнере. Если у вас не установлен Docker, то почитать об установке можно в посте "Docker 2.2 Установка Docker на Linux".
Стоит отметить, что в этом посте не будет всеобъемлющей настройки почтового сервера. Я расскажу как запустить "минимальную конфигурацию", чтобы можно было пользоваться.
Полный перечень конфигураций и возможностей можно найти в официальной документации: https://docker-mailserver.github.io/docker-mailserver/latest/
В прошлом посте мы подготовили домен для работы с почтой, в этом мы запустим почтовый сервер.
Запускать почтовый сервер будем в Docker-контейнере. Если у вас не установлен Docker, то почитать об установке можно в посте "Docker 2.2 Установка Docker на Linux".
Стоит отметить, что в этом посте не будет всеобъемлющей настройки почтового сервера. Я расскажу как запустить "минимальную конфигурацию", чтобы можно было пользоваться.
Полный перечень конфигураций и возможностей можно найти в официальной документации: https://docker-mailserver.github.io/docker-mailserver/latest/
Напомню используемое окружение:
Действия в данном посте подразумевают, что у вас имеется VPS сервер, настроенный домен и действующий SSL-сертификат.
Могу порекомендовать два хостинга:
- HSHP - достаточно дешевые сервера в Германии, отлично подойдут для тестов или скажем настроить собственный VPN.
- TimeWeb Cloud - наверное самый надёжный хостинг из всех, что я пробовал. Так же тут удобно приобретать или подключать свои домены.
(Ссылки реферальные - вам не сложно, а мне приятно, спасибо.)
Используемый сервер:
- CPU: 1x 3.3ГГц
- RAM: 2Гб
- SSD: 20Гб NVMe
- OS: Debian 12
Файл Docker Compose и конфигурация переменных окружения
Подключаемся по SSH к серверу и переходим в удобную для работы директорию.
Далее выполняем команду
Переходим в директорию, выполнив команду
Необходимо скачать два файла:
В первом находится конфигурация Docker Compose сервиса, а во втором параметры переменных окружения, определяющих настройки почтового сервера.
Для этого выполняем две команды:
Также, вы можете найти эти файлы в архиве с материалами к посту.
Редактирование файла
Откроем файл выполнив команду
-
-
Готово. Нажимаем
Редактирование файла
Откроем файл выполнив команду
-
-
-
-
-
-
-
-
-
-
Готово. Нажимаем
Действия в данном посте подразумевают, что у вас имеется VPS сервер, настроенный домен и действующий SSL-сертификат.
Могу порекомендовать два хостинга:
- HSHP - достаточно дешевые сервера в Германии, отлично подойдут для тестов или скажем настроить собственный VPN.
- TimeWeb Cloud - наверное самый надёжный хостинг из всех, что я пробовал. Так же тут удобно приобретать или подключать свои домены.
(Ссылки реферальные - вам не сложно, а мне приятно, спасибо.)
Используемый сервер:
- CPU: 1x 3.3ГГц
- RAM: 2Гб
- SSD: 20Гб NVMe
- OS: Debian 12
Файл Docker Compose и конфигурация переменных окружения
Подключаемся по SSH к серверу и переходим в удобную для работы директорию.
Далее выполняем команду
mkdir dms для создания директории в которой будут находиться конфигурационные файлы почтового сервера. Название директории можете изменить по желанию.Переходим в директорию, выполнив команду
cd dms.Необходимо скачать два файла:
compose.yaml и mailserver.env.В первом находится конфигурация Docker Compose сервиса, а во втором параметры переменных окружения, определяющих настройки почтового сервера.
Для этого выполняем две команды:
wget "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/compose.yaml"
wget "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.env"
Также, вы можете найти эти файлы в архиве с материалами к посту.
Редактирование файла
compose.yaml.Откроем файл выполнив команду
nano compose.yaml и изменим следующие параметры:-
hostname - в этом параметре прописываем почтовый домен, в моём случае это mail.pressanybutton.ru-
volumes - в этом параметре описываются локальные директории подключаемые в контейнере. Добавим две строчки в этот параметр:- ./docker-data/dms/rspamd/:/etc/rspamd/override.d/
- ./docker-data/dms/custom-certs/:/tmp/dms/custom-certs/:ro
Готово. Нажимаем
CTRL+S для сохранения, затем CTRL+X для выхода.Редактирование файла
mailserver.env.Откроем файл выполнив команду
nano mailserver.env и изменим следующие параметры:-
POSTMASTER_ADDRESS - данный параметр определяет почту администратора. Указываем почту по вашему желанию, например, у меня это - [email protected]-
TZ - указывает на временную зону. Указываем подходящий вам часовой пояс, например, Europe/Moscow-
ENABLE_OPENDKIM, ENABLE_OPENDMARC, ENABLE_POLICYD_SPF и ENABLE_AMAVIS - эти параметры выставляем на 0, поскольку за это будет отвечать Rspamd-
ENABLE_CLAMAV - параметр, отвечающий за работу антивируса ClamAV. Включать его или нет, выбирать вам, поскольку он достаточно сильно нагружает сервер и исходить нужно из имеющихся ресурсов и потребностей.-
ENABLE_RSPAMD - параметр, отвечающий за работу Rspamd. Устанавливаем здесь 1 для включения. Он необходим нам для работы DKIM, о котором чуть дальше. Rspamd — это высокопроизводительный сервер обработки почты с открытым исходным кодом. Он предназначен для фильтрации спама и вирусов, а также для ускорения обработки почты.-
SMTP_ONLY - параметр, переключающий почтовый сервер в только SMTP-сервер. В таком режиме он сможет только отправлять почту.-
SSL_TYPE - параметр, определяющий какой тип SSL-сертификата будет использоваться. Выставляем manual.-
SSL_CERT_PATH - путь до сертификата. Указываем /tmp/dms/custom-certs/cert.crt-
SSL_KEY_PATH - путь до ключа. Указываем /tmp/dms/custom-certs/privkey.key-
ENABLE_SPAMASSASSIN - параметр, отвечающий за работу Spam Assassin. Включайте по желанию и имеющимся ресурсам.Готово. Нажимаем
CTRL+S для сохранения, затем CTRL+X для выхода.Сертификаты.
Выполните следующую команду:
В итоге должны создаться три директории и мы окажемся в директории
В эту директорию необходимо поместить сертификат и ключ с теми же именами, что прописывали ранее в конфигурационном файле.
Первый запуск.
Для запуска возвращаемся в основную директорию
Откройте второй терминал и подключитесь к серверу.
Нам необходимо создать почтовый ящик. Для этого выполняем команду
После этого необходимо добавить псевдоним главного почтового адреса, выполнив команду
DKIM.
В прошлом посте, я упоминал его в списке необходимых для прописывания в домене, сейчас мы его добавим.
DKIM (DomainKeys Identified Mail) - метод аутентификации электронной почты, который добавляет цифровую подпись в сообщение. Это помогает подтвердить, что сообщение пришло от предполагаемого отправителя.
Всё в том же втором терминале выполняем следующую команду:
После выполнения отобразится результат работы и будет указан хост и значение для TXT-записи.
Перейдите в панель управления доменом и создайте новую запись.
В моём случае хост:
Значение:
После этого возвращаемся в терминал и из директории
Затем открываем его выполнив команду
В разделе
Готово. Нажимаем
Завершение настройки.
Переходим в первый терминал с запущенным сервером и нажимаем
И запускаем снова, в этот раз в фоне(хотя можно и не в фоне, чтобы убедиться, что проблем нет) выполнив команду
Выполните следующую команду:
mkdir docker-data && cd docker-data && mkdir dms && cd dms && mkdir custom-certs && cd custom-certs
В итоге должны создаться три директории и мы окажемся в директории
custom-certs.В эту директорию необходимо поместить сертификат и ключ с теми же именами, что прописывали ранее в конфигурационном файле.
Первый запуск.
Для запуска возвращаемся в основную директорию
dms где находится файл compose.yaml и выполняем команду docker compose up. Если всё указано верно, сервер запустится и начнёт работу, но необходимы ещё настройки.Откройте второй терминал и подключитесь к серверу.
Нам необходимо создать почтовый ящик. Для этого выполняем команду
docker exec -ti mailserver setup email add <ADDRESS> <PASSWORD>. Где mailserver - имя контейнера, если вы не меняли его в файле compose.yaml, то оно будет mailserver.После этого необходимо добавить псевдоним главного почтового адреса, выполнив команду
docker exec -ti mailserver setup alias add [email protected] [email protected]. Первой почтой указываем почту, прописанную в файле mailserver.env, вторым можете указать удобную для вас почту на другом домене или ранее созданную почту.DKIM.
В прошлом посте, я упоминал его в списке необходимых для прописывания в домене, сейчас мы его добавим.
DKIM (DomainKeys Identified Mail) - метод аутентификации электронной почты, который добавляет цифровую подпись в сообщение. Это помогает подтвердить, что сообщение пришло от предполагаемого отправителя.
Всё в том же втором терминале выполняем следующую команду:
docker exec -ti mailserver setup config dkimПосле выполнения отобразится результат работы и будет указан хост и значение для TXT-записи.
Перейдите в панель управления доменом и создайте новую запись.
В моём случае хост:
mail._domainkeyЗначение:
v=DKIM1; k=rsa; p=MIIB.........После этого возвращаемся в терминал и из директории
dms, в которой файл compose.yaml, переходим в директорию docker-data/dms/rspamd там создаём файл dkim_signing.conf выполнив команду touch dkim_signing.conf.Затем открываем его выполнив команду
nano dkim_signing.conf и вставляем следующий текст:# documentation: https://rspamd.com/doc/modules/dkim_signing.html
enabled = true;
sign_authenticated = true;
sign_local = true;
use_domain = "header";
use_redis = false; # don't change unless Redis also provides the DKIM keys
use_esld = true;
check_pubkey = true; # you wan't to use this in the beginning
domain {
pressanybutton.ru {
path = "/tmp/docker-mailserver/rspamd/dkim/rsa-2048-mail-pressanybutton.ru.private.txt";
selector = "mail";
}
}
В разделе
domain указываем ваш домен, ниже в строке путь rsa-2048-mail-pressanybutton.ru.private.txt меняем на название файла находящегося по пути dms/docker-data/dms/config/rspamd/dkimГотово. Нажимаем
CTRL+S для сохранения, затем CTRL+X для выхода.Завершение настройки.
Переходим в первый терминал с запущенным сервером и нажимаем
CTRL+C для остановки. Далее на всякий случай удаляем контейнер, если он не удалился после остановки docker rm mailserver. И запускаем снова, в этот раз в фоне(хотя можно и не в фоне, чтобы убедиться, что проблем нет) выполнив команду
docker composer up -d.Подключение к почте и проверка.
Для подключения к почте, можно воспользоваться программой
Выбираем подключить существующую почту, вводим имя, адрес почты и пароль. Программа найдёт конфигурацию самостоятельно и подключится к серверу.
Далее открываем сайт https://www.mail-tester.com/ , копируем указанную почту и отправляем на неё письмо, желательно с осмысленной темой и содержимым. Затем на сайте нажимаем кнопку под адресом. Спустя несколько секунд должна отобразиться оценка и будут указаны ошибки, если что-то было неправильно настроено. Но, если всё делали в точности, должно быть 10/10!
Также, можете отправить письмо себе на разные ящики и замучить тестами друзей 🙂
Настройка Django.
Изначально с этого всё и началось, что нужен был почтовый сервер для отправки почты с сайта.
Откроем файл
В поле
В поле
В поле
Готово! Теперь Django отправляет почту от имени нашего домена через наш почтовый сервер!
Провозился с этим постом конечно долго, в процессе было уйма ошибок и попыток понять, как работает современная почтовая система со всеми их защитами от спама.
На самом деле, в этом посте только базовая настройка, сам
Файлы к посту, можно получить в боте по коду: 245646
Пост на сайте.
Поддержать канал.
Для подключения к почте, можно воспользоваться программой
Thunderbird. Скачать можно на сайте: https://www.thunderbird.net/ru/Выбираем подключить существующую почту, вводим имя, адрес почты и пароль. Программа найдёт конфигурацию самостоятельно и подключится к серверу.
Далее открываем сайт https://www.mail-tester.com/ , копируем указанную почту и отправляем на неё письмо, желательно с осмысленной темой и содержимым. Затем на сайте нажимаем кнопку под адресом. Спустя несколько секунд должна отобразиться оценка и будут указаны ошибки, если что-то было неправильно настроено. Но, если всё делали в точности, должно быть 10/10!
Также, можете отправить письмо себе на разные ящики и замучить тестами друзей 🙂
Настройка Django.
Изначально с этого всё и началось, что нужен был почтовый сервер для отправки почты с сайта.
Откроем файл
settings.py и найдём настройки почтового сервера, а если их не было, вписываем следующие:EMAIL_HOST = 'mail.pressanybutton.ru'
EMAIL_PORT = 465
EMAIL_HOST_USER = ""
EMAIL_HOST_PASSWORD = ""
EMAIL_USE_TLS = False
EMAIL_USE_SSL = True
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
В поле
EMAIL_HOST вписываем ваш почтовый домен.В поле
EMAIL_HOST_USER вписываем почтовый адрес.В поле
EMAIL_HOST_PASSWORD вписываем пароль от почтового адреса.Готово! Теперь Django отправляет почту от имени нашего домена через наш почтовый сервер!
Провозился с этим постом конечно долго, в процессе было уйма ошибок и попыток понять, как работает современная почтовая система со всеми их защитами от спама.
На самом деле, в этом посте только базовая настройка, сам
Docker Mailserver весьма функционален и у него много возможностей, но настройка всего требует времени и знаний. Я постарался описать так, что бы "сделал и оно работает", а настройка под конкретные ситуации, уже на пользователе.Файлы к посту, можно получить в боте по коду: 245646
Пост на сайте.
Поддержать канал.
🔥2
Как быстро вы ловите себя на мысли, что допустили ошибку при написании кода? (до выполнения и её проявления)
Anonymous Poll
11%
Довольно быстро, сразу исправляю
8%
Есть ощущение, что что-то не так, но не ищу причину
61%
Замечаю после запуска и пересмотра кода
19%
Замечаю только при её проявлении
Django 30. Рефакторинг и допущенные ошибки
Ошибки - неотъемлемая часть программирования. Как ни старайся, всё равно допустишь ошибки, которые по началу сочтёшь мелкими и незначительными, а по факту они соберутся в "снежный ком".
Приступив к написанию одного из следующих постов, я обнаружил несколько неудобных моментов в своём коде. Этого можно было бы избежать изначально, но невнимательность сделала своё дело.
В этом посте я проведу небольшой рефакторинг, а вернее даже, реорганизацию своего кода (и чуть-чуть скреплю это "костылями" и "синей изолентой").
Директория с шаблонами.
Начнём с простого. Сейчас есть всего одно приложение
Ошибки - неотъемлемая часть программирования. Как ни старайся, всё равно допустишь ошибки, которые по началу сочтёшь мелкими и незначительными, а по факту они соберутся в "снежный ком".
Приступив к написанию одного из следующих постов, я обнаружил несколько неудобных моментов в своём коде. Этого можно было бы избежать изначально, но невнимательность сделала своё дело.
В этом посте я проведу небольшой рефакторинг, а вернее даже, реорганизацию своего кода (и чуть-чуть скреплю это "костылями" и "синей изолентой").
Директория с шаблонами.
Начнём с простого. Сейчас есть всего одно приложение
blog и директория с шаблонами находится в нём, но в будущем (и как следовало бы, в прошлом) будет несколько приложений. Каждое будет отвечать за свою область и у всех будут свои шаблоны. Делать в каждом приложении свою директорию с шаблонами не очень красиво, удобнее всё собрать в одном месте.🔥3
К слову, это даже было предусмотрено. Изначально в посте по первоначальной настройке, мы добавили в параметр
Решение проще некуда. Достаточно просто вынести директорию
В ней находится директория
Документирование.
Классов, методов и функций становится всё больше, порой даже можно забыть зачем писал что-то. По-хорошему нужна хотя бы минимальная документация для класса и методов в нём.
Задача простая и поправимая, главное не забыть писать комментарии к чему-либо сразу при написании.
Разделение на приложения.
Добрались до главной ошибки.
В Django принято разделять логические участки на отдельные приложения, например, приложение для блога, приложение для API, приложение для аутентификации и профиля пользователя и так далее.
Моя ошибка заключается в том, что я блог и API уместил в одном приложении блога. Это не критичная ошибка, всё работает, однако это создаёт проблему навигации по коду. Код разрастается, состоит из блоков для разных задач.
Для исправления этой ситуации, я создам новое приложение
Если вы ещё только в процессе разработки сайта, не "пихайте" всё в одно приложение. Продумайте "на берегу" структуру и будущие модули. Я этого не сделал, теперь буду городить "костыли". Главное вовремя найти ошибку, исправить её и выучить урок.
Создание нового приложения.
Создадим новое приложение
Переходим сразу в
И создадим файл
Перенос моделей и файлов.
Далее необходимо перенести всё связанное с API из приложения
Начнём с модели. Полностью вырезаем код необходимых моделей и переносим его в файл
Проверяем, не осталось ли каких-либо связей в других моделях относительно перенесённых. Если остались, правим импорты.
Затем в класс
Таким образом код у нас находится в новом приложении, но модель считается моделью старого приложения и таблицы БД не будут перезаписаны. Если у вас нет данных в БД, пометку делать не нужно.
Далее переносим из файла
Переносим файлы
Переносим URL-паттерны для API из файла
Применяем миграции. Результатом должно быть отсутствие новых миграций.
Готово. Всё должно работать, как и раньше.
Завершение.
Да, модели хоть и находятся на новом месте, но относятся к старому. Возможно в будущем, углубившись в Django я найду решение с "безболезненным" переносом данных модели. Но пока оставлю так, как говорится "надо было думать раньше".
Возможно, в моём коде есть ещё ошибки которые я не замечаю, буду рад если укажете на них в комментариях.
Файлы к посту, можно получить в боте по коду: 919633
Пост на сайте.
Поддержать канал.
TEMPLATES строку - 'DIRS': [BASE_DIR / 'templates'],.Решение проще некуда. Достаточно просто вынести директорию
templates из директории приложения в директорию уровнем выше, где находится файл manage.py.В ней находится директория
blog, отвечающая за шаблоны приложения blog. В дальнейшем будут другие директории одноимённые используемым приложениям.Документирование.
Классов, методов и функций становится всё больше, порой даже можно забыть зачем писал что-то. По-хорошему нужна хотя бы минимальная документация для класса и методов в нём.
Задача простая и поправимая, главное не забыть писать комментарии к чему-либо сразу при написании.
Разделение на приложения.
Добрались до главной ошибки.
В Django принято разделять логические участки на отдельные приложения, например, приложение для блога, приложение для API, приложение для аутентификации и профиля пользователя и так далее.
Моя ошибка заключается в том, что я блог и API уместил в одном приложении блога. Это не критичная ошибка, всё работает, однако это создаёт проблему навигации по коду. Код разрастается, состоит из блоков для разных задач.
Для исправления этой ситуации, я создам новое приложение
api_app и перенесу в него всё, что связано с API. И всё бы ничего, но у меня есть несколько моделей и они содержат данные в БД. Простого способа перенести модель из приложения в приложение с сохранением данных в новой таблице я не нашёл. Однако есть один, весьма простой, но "костыльный" способ. Если вы ещё только в процессе разработки сайта, не "пихайте" всё в одно приложение. Продумайте "на берегу" структуру и будущие модули. Я этого не сделал, теперь буду городить "костыли". Главное вовремя найти ошибку, исправить её и выучить урок.
Создание нового приложения.
Создадим новое приложение
api_app выполнив команду python manage.py startapp api_app.Переходим сразу в
settings.py и добавляем новое приложение в INSTALLED_APPS.И создадим файл
urls.py в директории приложения api_app.Перенос моделей и файлов.
Далее необходимо перенести всё связанное с API из приложения
blog в приложение api_app.Начнём с модели. Полностью вырезаем код необходимых моделей и переносим его в файл
models.py в новом приложении.Проверяем, не осталось ли каких-либо связей в других моделях относительно перенесённых. Если остались, правим импорты.
Затем в класс
Meta перенесённых моделей добавляем новый пункт app_label и указываем имя старого приложения.Таким образом код у нас находится в новом приложении, но модель считается моделью старого приложения и таблицы БД не будут перезаписаны. Если у вас нет данных в БД, пометку делать не нужно.
Далее переносим из файла
admin.py связанные классы. Правим импорты.Переносим файлы
api.py и serializers.py. Правим импорты.Переносим URL-паттерны для API из файла
urls.py в новое приложение. Правим импорты и переходим в файл urls.py, находящийся в директории проекта. Добавляем новый паттерн path('api/', include('api_app.urls', namespace='api_app')),.Применяем миграции. Результатом должно быть отсутствие новых миграций.
Готово. Всё должно работать, как и раньше.
Завершение.
Да, модели хоть и находятся на новом месте, но относятся к старому. Возможно в будущем, углубившись в Django я найду решение с "безболезненным" переносом данных модели. Но пока оставлю так, как говорится "надо было думать раньше".
Возможно, в моём коде есть ещё ошибки которые я не замечаю, буду рад если укажете на них в комментариях.
Файлы к посту, можно получить в боте по коду: 919633
Пост на сайте.
Поддержать канал.
🔥2
Cpp FreeGPT WebUI - Бесплатный GPT на вашем сервере
FreeGPT мёртв, да здравствует FreeGPT!
Сегодня, благодаря комментариям на канале, выяснилось, что FreeGPT, о котором я писал ранее прекращает свою работу.
Добавил об этом пометку и сообщение автора в посте "Бесплатный Chat-GPT4 на вашем ПК или сервере".
Заинтересовался вопросом, нет ли альтернатив и, как оказалось альтернатива есть.
Встречайте
Написан на C++. Использует GPT4Free API и WebUI от ChatGPT Clone.
Доступны вариации моделей Chat GPT 3.5 Turbo и Chat GPT 4 (насчёт четвёрки не уверен, скорее всего та же тройка).
Ссылка на GitHub проекта: https://github.com/fantasy-peak/cpp-freegpt-webui#cpp-freegpt-webui
Единственный минус данного решения - установка либо на Linux, либо в Docker-контейнере.
А остальное, вы все прекрасно знаете. Приступим к установке.
FreeGPT мёртв, да здравствует FreeGPT!
Сегодня, благодаря комментариям на канале, выяснилось, что FreeGPT, о котором я писал ранее прекращает свою работу.
Добавил об этом пометку и сообщение автора в посте "Бесплатный Chat-GPT4 на вашем ПК или сервере".
Заинтересовался вопросом, нет ли альтернатив и, как оказалось альтернатива есть.
Встречайте
Cpp FreeGPT WebUI.Написан на C++. Использует GPT4Free API и WebUI от ChatGPT Clone.
Доступны вариации моделей Chat GPT 3.5 Turbo и Chat GPT 4 (насчёт четвёрки не уверен, скорее всего та же тройка).
Ссылка на GitHub проекта: https://github.com/fantasy-peak/cpp-freegpt-webui#cpp-freegpt-webui
Единственный минус данного решения - установка либо на Linux, либо в Docker-контейнере.
А остальное, вы все прекрасно знаете. Приступим к установке.