Код на салфетке
2.22K subscribers
745 photos
14 videos
2 files
788 links
Канал для тех, кому интересно программирование на Python и не только.

Сайт: https://pressanybutton.ru/
Чат: https://t.iss.one/+Li2vbxfWo0Q4ZDk6
Заметки автора: @writeanynotes

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
AIOgram3 2. Точка входа

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

Начнём с простого эхо-бота создав точку входа.
В корне проекта создаём файл main.py.
Напишем условие запуска:
import asyncio

if __name__ == '__main__':
asyncio.run(start())

Давайте разберём, что это такое и как работает.
В первой строке мы импортировали библиотеку asyncio входящую в состав стандартной библиотеки. Она предоставляет простой и эффективный способ написания кода, который может обрабатывать множество задач одновременно, без блокировки потока исполнения. asyncio использует цикл событий, который обрабатывает различные задачи асинхронно и эффективно управляет ресурсами системы.

Третья строка - это условие, которое проверяет, запущен ли данный скрипт как самостоятельное приложение. Если данный скрипт является основным файлом, то __name__ примет значение __main__ , и условие входит в силу.

asyncio.run() в четвёртой строке - это функция, которая запускает цикл событий asyncio, являющийся сердцем асинхронного программирования в Python. Она выполняет переданную ей корутину (функцию) и обрабатывает все события, пока она не завершится.
В ней мы передаём функцию start(), которую начнём писать в следующем посте.

Таким образом, при выполнении данного кода, условие if проверяет, запущен ли скрипт как основной файл, и если это так, используется asyncio.run() для запуска функции start(), содержащей асинхронный код.

Файлы к посту, можно получить в боте по коду: 389064
Пост на сайте.
Поддержать канал.

#aiogram #python #точка_входа #main #asyncio
👍3
Поправка к посту Django 3. Базовая конфигурация

В посте допустил ошибку в описании путей к STATIC_ROOT и MEDIA_ROOT.
Было так:
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / '/static/'

MEDIA_URL = 'media/'
MEDIA_ROOT = BASE_DIR / '/media/'


А должно быть так:
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'static/'

MEDIA_URL = 'media/'
MEDIA_ROOT = BASE_DIR / 'media/'


В первом варианте была передача пути от корня файловой системы, а нам нужен относительный путь от папки проекта.

Извиняюсь и прошу тех, кто повторял за мной, поправить данный момент.
👍2
AIOgram3 3. Основная функция

В прошлом посте мы написали точку входа и запуск из неё функции start().
Именно написанием этой функции и займёмся.

Между импортом и точкой входа, объявим функцию:
async def start():

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

В теле функции объявим переменную bot и присвоим ей объект класса Bot, необходимый для взаимодействия с API Telegram:
from aiogram import Bot

bot = Bot(token='ваш_токен')

В параметр token передаём полученный от BotFather токен. Стоит отметить, такая явная передача токена боту, является не безопасной. В следующих постах мы изменим передачу токена, а когда дойдём до развёртывания бота на сервере, я расскажу как правильно передавать секреты в бота.

Далее нам необходимо создать объект класса Dispatcher:
from aiogram import Dispatcher

dp = Dispatcher()

Dispatcher() создает поток для обработки всех входящих запросов, проверяет тип запроса, извлекает все необходимые данные из запроса и передает их в соответствующий обработчик.

И наконец, необходимо запустить диспетчер в режиме "polling". Так называется бесконечный цикл "опроса" сервера(в нашем случае, сервера Telegram), на предмет новых сообщений или событий.
    try:
await dp.start_polling(bot)
finally:
await bot.session.close()
В данном блоке используется конструкция try-finally. Диспетчер будет работать до тех пор, пока не будет остановлен. После остановки диспетчера, будет выполнена команда закрытия сессии и выход их программы.

В следующем посте, сделаем эхо-бота и проверим работу.

Файлы к посту, можно получить в боте по коду: 627598
Пост на сайте.
Поддержать канал.

#aiogram #python #main #start #try_except
👍2
AIOgram3 4. Эхо-бот

Для того, что бы сделать повторяющего за нами бота, давайте создадим функцию echo.
Между импортами и функцией start() создадим функцию:
from aiogram.types import Message  


async def echo(message: Message):

В теле функции напишем код ответа на сообщение:
    await message.answer(message.text)
Переменная message, переданная в функцию, является объектом класса Message. Мы, используя доступный нам метод answer, отвечаем пользователю, отправившему сообщение боту.
В качестве ответа пользователю, мы отправляем его же сообщение. Текст ответа получим из переменной message воспользовавшись ещё одним методом text, возвращающим текстовое представление данных.
👍31
Также, стоит упомянуть про await.
Ключевое слово await используется только внутри асинхронной функции и только для вызова асинхронных операций. Оно используется с операциями, которые могут занять некоторое время. Поскольку эти операции требуют времени на выполнение, программа может продолжить выполнение других задач в это время, а затем вернуться к исходной задаче только после завершения асинхронной операции.
Таким образом, await в данном случае означает, что программа должна дождаться отправки сообщения, прежде чем продолжить дальнейшее выполнение кода.

Теперь нам необходимо зарегистрировать данную функцию.
В функции start(), после инициализации диспетчера, но до блока try-finally, регистрируем функцию, на приём всех сообщений:
    dp.message.register(echo)
Обратите внимание! При регистрации функции, мы пишем только её название, без круглых скобок!

Настало время запустить бота и проверить его работу. Запускаем файл main.py.
Поскольку у нас не инициализирован логгер и нет оповещения о запуске, то в терминале будет пусто, однако, если мы напишем боту... То он начнёт нам отвечать!

Для остановки бота, если он запущен в PyCharm, достаточно нажать на остановку.
Если бот запущен в терминале, то для остановки необходимо выполнить сочетание клавиш CTRL+C.

Поздравляю, бот работает. В следующем посте начнём разграничивать функционал по модулям.

Файлы к посту, можно получить в боте по коду: 902691
Пост на сайте.
Поддержать канал.

#aiogram #python #эхо_бот #echo_bot
👍21
Поговорим.
О пути, планах, стремлениях.

Приветствую.
Давайте поговорим с вами в комментариях.

Расскажите о вашем пути. Новичок или специалист? Или только-только притрагиваетесь к интересному миру программирования.

Какие у вас планы? Быть может амбиции огого!, через год быть топ-менеджером Газпрома, а может и планов нет, просто хобби?

Быть может у вас есть достижения, которыми вы хотите поделиться?

В общем, пишите, интересно будет почитать и обсудить.
👍3
Docker 1. Подготовка Windows

Перед установкой Docker Desktop необходимо подготовить систему.
Docker подразумевает использование ядра Linux той системы, на которой он запущен, что избавляет от необходимости запуска виртуальных машин. Однако с Windows ситуация несколько отличается.
Так как Windows построена на совершенно иной архитектуре, для работы Docker необходимо либо использование виртуальной машины, либо нововведение в Windows 10 - Windows Subsystem for Linux, он же WSL.
Это не виртуальная машина в прямом смысле. WSL запускает ядро Linux прямо внутри Windows. За счёт этого значительно экономятся ресурсы компьютера и повышается скорость работы Linux в системе.

Но так или иначе, для работы WSL требуется включение виртуализации.
Это можно сделать в BIOS, поискав информацию в интернете по вашей модели материнской платы/ноутбука. Стоит отметить, если у вас установлен и работает VirtualBox или, допустим. эмулятор Android, производить действия по включению не требуется, значит всё активировано и работает.
👍2
Далее необходимо включить подсистему Windows для Linux.
Запустите PowerShell от имени администратора. сделать это можно в меню "Пуск" > PowerShell > щелкните правой кнопкой мыши > Запуск от имени администратора.
И выполните следующую команду:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

А затем обновить включенный WSL до WSL2 следующей командой:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
После этого перезапустите компьютер для завершения установки WLS2.

После перезагрузки, необходимо скачать и установить пакет обновления для WSL2.
Скачать пакет можно по ссылке: https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

По завершении установки, снова запустите PowerShell и выполните следующую команду, для выбора WLS2 в качестве версии по умолчанию:
wsl --set-default-version 2

На этом подготовка завершена.

Отмечу от себя один момент. Не пренебрегайте установкой обновлений Windows. Именно там будут приходить обновления для WSL2. Да и в целом, обновления системы важная часть стабильной работы.

Файлы к посту, можно получить в боте по коду: 649348
Пост на сайте.
Поддержать канал.

#docker #windows #wsl #wsl2 #подготовка
👍2
Docker 2.1 Установка Docker Desktop на Windows

Подготовка позади, приступаем к установке Docker Desktop на Windows.

Скачиваем установщик по ссылке: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe
Откроется одно из самых минималистичных окон установки.
Там будет два пункта:
- Use WSL 2 instead of Hyper-V - обязательный параметр, позволит запускать контейнеры через WSL, а не через создание виртуальной машины.
- Add shortcut to desktop - добавлять ярлык на рабочий стол или нет, выбирайте по желанию.
Отметив первую галочку, нажимаем "Ok".
Начнётся процесс установки. Ждём.

По завершении установки нажимаем на большую синюю кнопку с надписью "Close".
Установка завершена.
👍3
Запустим Docker Desktop.
При первом запуске он попросит нас прочитать условия использования. Соглашаемся.
Далее будет опросник, можете поучавствовать, но я выбрал Skip.
Окно Docker Desktop можно закрыть. Убедитесь, что после закрытия окна, Docker остался в системном трее.

Пусть мы и установили Docker Desktop, работать мы будем в терминале, а именно в PowerShell.
Давайте убедимся, в корректности установки.
Запустим PowerShell и выполним команду:
docker --version
В ответ должны получить строку с текущей версией Docker. У меня это:
Docker version 24.0.2, build cb74dfc

Теперь проверим работу контейнеров на стандартном контейнере Hello-world. В терминале выполним команду:
docker run hello-world
Начнётся процесс скачивания и запуска образа. Затем в выводе должно появиться много текста, начинающегося с "Hello from Docker!".

Файлы к посту, можно получить в боте по коду: 743896
Пост на сайте.
Поддержать канал.

#docker #windows #установка #docker_desctop
Docker 2.2 Установка Docker на Linux

Если с Windows приходится повозится для установки Docker, то с линуксом всё просто до безобразия.

Я использую Debian 12 и всё, что напишу ниже будет относиться к нему. Команды для вашего дистрибутива, можно найти в официальной документации Docker по ссылке: https://docs.docker.com/engine/install/
👍3
Все действия выполняются в терминале. Откроем его.
Для начала удалим пакеты во избежание возможных конфликтов, выполнив следующую команду:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

Далее обновляем список доступных пакетов и устанавливаем поддержку HTTPS-репозиториев:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

Устанавливаем ключи сертификатов:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Добавляем репозиторий:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Снова обновляем список доступных пакетов и устанавливаем Docker:
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Теперь проверим работу контейнеров на стандартном контейнере Hello-world. В терминале выполним команду:
sudo docker run hello-world
Начнётся процесс скачивания и запуска образа. Затем в выводе должно появиться много текста, начинающегося с "Hello from Docker!".

В следующем посте, расскажу, как запустить контейнер с PostgreSQL.

Файлы к посту, можно получить в боте по коду: 695131
Пост на сайте.
Поддержать канал.

#docker #установка #lunux #debian
👍3
Docker 3. Контейнер с PostgreSQL

После всех подготовок и установок, наконец-то переходим к полезной практике.

Сегодня мы запустим Docker-контейнер с PostgreSQL.
Для этого нам нужна всего одна команда, но перед этим, мы создадим папку, в которой будут храниться файлы базы данных.
Поскольку, данные в контейнере сбрасываются до начального состояния образа, при перезапуске контейнера, нам нужна локальная папка для хранения файлов базы. Создать папку можно в любом месте, главное, что бы в пути не было кириллических символов. У меня это D:\psql.
👍1
Команда запуска:
docker run --name postgres-db -p 5432:5432 -e POSTGRES_USER=username -e POSTGRES_PASSWORD=password -e POSTGRES_DB=testdb -e PGDATA=/var/lib/postgresql/data/pgdata -v D:\psql:/var/lib/postgresql/data -d postgres:15.2
Разберём по порядку:
- docker run - команда Docker для запуска контейнера.
- --name - параметр определяющий имя контейнера для более удобного взаимодейсвтия с ним, в нашем случае это postgres-db.
- -p - параметр publish, определяет какой внутренний порт будет транслироваться из контейнера. Синтаксис <порт_вне_контейнера>:<порт_в_контейнере>. В нашем случае это стандартный порт PostgreSQL - 5432.
Внимание! Если у вас установлен PostgreSQL в системе вне Docker, значит порт 5432 занят. Изменяем <порт_вне_контейнера> на другой, например, 5433.

- -e - параметр передающий в контейнер переменные окружения. В нашем случае это:
- POSTGRES_USER - определяет имя пользователя БД.
- POSTGRES_PASSWORD - определяет пароль БД.
- POSTGRES_DB - определяет название БД.
- PGDATA - определяет место, где БД будет хранить данные.
- -v - параметр volume, необходим для подключения внешней(вне контейнера) директории, по внутреннему(в контейнере) пути. В моём случае это - D:\psql:/var/lib/postgresql/data, где D:\psql директория на моём компьютере, а /var/lib/postgresql/data место хранения данных в контейнере.
- -d - параметр сообщающий докеру, что мы хотим запустить контейнер в режиме демона, т.е. в фоновом режиме.
- В самом конце команды определяем используемый базовый образ и его версию. Без указания версии, будет использоваться последняя доступная версия. В нашем случае, мы будем использовать официальный Docker-образ postgres версии 15.2

Давайте выполним эту большую команду в терминале. Для запуска на Windows, убедитесь, что у вас запущен Docker Desktop
Начнётся скачивание базового образа из Docker Hub. После скачивания и запуска, терминал вернётся в режим ввода пользователя. Если не было никаких ошибок, значит контейнер запущен успешно. Убедиться в этом можно выполнив команду:
docker ps -a
Мы должны увидеть два контейнера. Hello-world, который мы запускали в прошлом посте и наш свеже-созданный postgres-db. В колонке STATUS в строке с БД, должно быть написано Up X minutes. Контейнер запущен и функционирует корректно.

Для остановки контейнера, нужно выполнить команду:
docker stop postgres-db
А для запуска остановленного контейнера:
docker start postgres-db

В следующем посте, расскажу про способы подключения к БД.

Файлы к посту, можно получить в боте по коду: 921886
Пост на сайте.
Поддержать канал.

#docker #postgresql #postgres #sql #установка #контейнер
🔥3👍1
Docker 4. Взаимодействие с контейнером PostgreSQL

Контейнер запустили, теперь давайте научимся с ним взаимодействовать.

Самый прямой способ взаимодействия, это зайти в контейнер и подключиться к CLI(Command Line Interface) PostgreSQL. Проще говоря, подключиться к БД в терминале.
Для этого необходимо в терминале выполнить следующую команду:
docker exec -it  <container-name> psql -U <dataBaseUserName> <dataBaseName>

Для варианта запуска, показанного в прошлом посте, строка будет выглядеть так:
docker exec -it  postgres-db psql -U username testdb
Подробнее про каждый пункт:
- docker exec - комманда позволяющая зайти в контейнер и выполнить указанную далее команду.
- -it - параметр, сообщающий докеру, что мы хотим подключиться в интерактивном режиме. Бывают случаи, когда терминал занят другим приложением, например выводом запущенного бота и чтобы выйти из контейнера не завершая работу запущенного приложения, необходимо нажать сочетание клавиш CTRL+Q+CTRL+P
- <container-name> - имя или идентификатор контейнера, к которому хотим подключиться
- psql - команда для выполнения в контейнере. В нашем случае это подключение к PostgreSQL в консоли.
- -U <dataBaseUserName> <dataBaseName> - параметры предыдущей команды. Тут мы передаём флаг -U, указывающий, что далее будет введено имя пользователя для авторизации и имя базы данных к которой необходимо подключиться.

В итоге команда должна выглядеть следующим образом:
docker exec -it postgres-db psql -U username testdb
Так, мы попадём в консольный интерфейс PostgreSQL. Можно работать с БД.
Для выхода достаточно ввести команду exit.

Другой способ подключиться к БД, это использовать менеджеры баз данных.
Таких программ много, например PgAdmin, DBeaver и другие.
Установив любой менеджер поддерживающий PostgreSQL, для подключения к БД необходимо указать следующие данные:
- host: localhost
- port: 5432
- username: username
- password: password
- database: testdb

Точно так же, можно использовать запущенную БД в наших проектах, например в Django:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': testdb,
'USER': username,
'PASSWORD': password,
'HOST': 'localhost',
'PORT': '5432',
}
}

На этом всё. Если возникнут вопросы по данной теме, не стесняйтесь задавать их в комментариях, обязательно постараюсь ответить.

Файлы к посту, можно получить в боте по коду: 684611
Пост на сайте.
Поддержать канал.

#docker #postgresql #postgres #sql #контейнер
👍2
Django 5. Инициализация приложения блога

Я не просто так назвал данный пост "Инициализация приложения блога". В Django, проектом считается сам установленный и инициализированный Django. Этим мы занимались во втором посте. А вот страницы сайта или отдельные модули называются приложениями. Именно созданием приложения мы займемся сегодня.

Для создания приложения необходимо в терминале выполнить команду: python manage.py startapp blog. Убедитесь, что в терминале вы находитесь в той же директории, что и файл manage.py. В дальнейшем я не буду заострять на этом внимание.
В папке с проектом появилась директория blog с набором пустых файлов приложения.
🔥2
Пройдёмся по основным файлам приложения:
- Файл admin.py - в данном файле будем указывать всё, что непосредственно связано с панелью администратора. В основном, это регистрация моделей.
- Папка migrations - в ней будут собираться файлы с описаниями миграций базы данных, относящихся именно к приложению.
- Файл models.py - в данном файле будем описывать модели и менеджеров базы данных.
- Файл views.py - в данном файле описываются представления соответствующие страницам на сайте.
- В дальнейшем будут созданы и другие файлы разной функциональной направленности.

Приложение создано, но ещё не активировано. Для активации необходимо вернуться в файл settings.py и в параметр INSTALLED_APPS добавить строку с указанием конфигурации приложения.
INSTALLED_APPS = [
# Содержимое списка
# ...
'blog.apps.BlogConfig',
]
Как мы получили данную строку?
Первый параметр blog - название приложения, указанное при его создании.
Второй параметр apps - указание на файл apps.py в директории приложения.
Третий параметр BlogConfig - указание на класс BlogConfig в упомянутом ранее файле.

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

Файлы к посту, можно получить в боте по коду: 966714
Пост на сайте.
Поддержать канал.

#django #python #приложение
👍3
Django 6. Базовый шаблон

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

Для создания шаблона, мы будем использовать CSS-фреймворк Bootstrap5.
Давайте его скачаем. Нам нужен CSS-файл и JS-файл.
CSS: https://bootswatch.com/5/lumen/bootstrap.css
JS: https://raw.githubusercontent.com/twbs/bootstrap/v5.3.0/dist/js/bootstrap.bundle.js
Если у вас в браузере, файл не скачивается, а открылся для просмотра, просто нажмите сочетание клавиш CTRL+S
👍3