Легкий путь в Python
5.1K subscribers
97 photos
18 videos
3 files
155 links
Я — Алексей Яковенко, опытный разработчик Python. Здесь вы найдете статьи, заметки, посты и видео для прокачки навыков программирования 🐍 Интересное найдет и новичок, и профи 💡

📬По вопросам: https://t.me/yakvenalexx
🗣Сообщество: https://vk.cc/cxKNTb
Download Telegram
Запуск Телеграм-бота через systemd с виртуальным окружением: инструкция

Раз уже пошла тема про деплой телеграмм бота на VPS сервере поделюсь с вами ещё одним способом. На этот раз с использованием systemd.

1. Подготовка

👉 Скопировать файлы бота на сервер.
👉 Установить виртуальное окружение и все зависимости.
👉 Проверить, что бот работает при ручном запуске.

2. Скрипт для запуска бота

Создать Python-скрипт, который активирует виртуальное окружение и запускает бота. Вот пример:

import os
import subprocess

script_path = os.path.join(os.path.dirname(file), '/home/bot_dir/aiogram_run.py')

if os.path.exists(script_path):
subprocess.run(['/home/bot_dir/env/bin/python3', script_path], check=True)
else:
print("Не удалось найти скрипт aiogram_run.py.")


Сохранить, например, как run_bot.py.

3. Создание systemd сервиса

Создать файл сервиса:
sudo nano /etc/systemd/system/имя_бота.service


Пример содержимого:
[Unit]
Description=ИМЯ БОТА
After=multi-user.target

[Service]
Type=simple
ExecStart=/home/user/путь_к_боту/env/bin/python3 /home/user/путь_к_боту/run_bot.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

В целом, этот файл:

👉 Запускает бот с использованием виртуального окружения.
👉 Обеспечивает автоматический перезапуск бота в случае его падения.
👉 Гарантирует, что бот запускается при старте системы.

4. Настройка прав и запуск

chmod +x /home/user/путь_к_боту/run_bot.py
chmod +x /etc/systemd/system/имя_бота.service
sudo systemctl daemon-reload
sudo systemctl start имя_бота
sudo systemctl enable имя_бота


5. Полезные команды

Просмотр лога: sudo journalctl -u имя_бота
Лог в реальном времени: sudo journalctl -f -u имя_бота
Очистка кэша: sudo journalctl --vacuum-time=1s
Перезапуск бота: sudo systemctl restart имя_бота


Метод тоже достаточно простой. Для того чтоб изменения вступили в силу после правок кода используем: sudo systemctl restart имя_бота
👍86🔥4
А вот пример run_bot.py файла для ленивых😊👇

import os
import subprocess

script_path = os.path.join(os.path.dirname(__file__), 'aiogram_run.py')
venv_path = '/home/bot_dir/env'
requirements_path = '/home/bot_dir/requirements.txt'

# Проверяем наличие виртуального окружения
if not os.path.exists(venv_path):
print("Виртуальное окружение не найдено. Создаем...")
subprocess.run(['python3', '-m', 'venv', venv_path], check=True)
print("Виртуальное окружение создано.")

# Устанавливаем зависимости
subprocess.run([os.path.join(venv_path, 'bin', 'pip'), 'install', '-r', requirements_path], check=True)
print("Зависимости установлены.")

# Проверяем наличие скрипта
if os.path.exists(script_path):
subprocess.run([os.path.join(venv_path, 'bin', 'python3'), script_path], check=True)
else:
print("Не удалось найти скрипт aiogram_run.py.")


Этот скрипт сначала проверяет наличие виртуального окружения в указанной директории. Если оно отсутствует, то создается новое окружение и устанавливаются зависимости из файла requirements.txt. Затем проверяется наличие скрипта aiogram_run.py, и если он существует, то запускается.
🔥12👍84👏2
Привет, друзья!

Рад сообщить, что я готовлю для вас новый практический гайд, но, на этот раз, по FastApi. Мы создадим полноценный мини-чат, используя FastApi. В процессе вы познакомитесь с такими важными аспектами, как вебсокеты, а также узнаете, как применять асинхронную алхимию с SQLite (в предыдущих примерах мы использовали PostgreSQL).

Надеюсь, что вы будете ждать выхода публикации!
🔥25👍114
Создание кастомных обработчиков исключений в FastAPI

Я давно грозился рассказать вам про кастомные обработчики исключений в FastApi. Сейчас продемонстрирую это дело на ошибке когда токен авторизации истек или когда токена нет (в случае логаута).

Для начала создадим файл exceptions.py на одном уровне с main.py. В этом файле определим два класса исключений для обработки наших ситуаций.
from fastapi import status, HTTPException

class TokenExpiredException(HTTPException):
def __init__(self):
super().__init__(status_code=status.HTTP_401_UNAUTHORIZED, detail="Токен истек")

class TokenNotFoundException(HTTPException):
def __init__(self):
super().__init__(status_code=status.HTTP_401_UNAUTHORIZED, detail="Токен не найден")

Эти классы наследуют от HTTPException и задают соответствующие статус-коды и сообщения об ошибках.

Теперь добавим обработчики этих исключений в main.py. При возникновении таких ошибок, пользователь будет перенаправлен на страницу /auth.
from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponse
from app.exceptions import TokenExpiredException, TokenNotFoundException

app = FastAPI()

@app.exception_handler(TokenExpiredException)
async def token_expired_exception_handler(request: Request, exc: TokenExpiredException):
# Перенаправляем пользователя на страницу /auth
return RedirectResponse(url="/auth")

@app.exception_handler(TokenNotFoundException)
async def token_not_found_exception_handler(request: Request, exc: TokenNotFoundException):
# Перенаправляем пользователя на страницу /auth
return RedirectResponse(url="/auth")

Здесь мы используем декоратор @app.exception_handler для привязки наших кастомных исключений к обработчикам. В случае возникновения исключения, пользователь будет перенаправлен на страницу авторизации.

Как видите, в FastAPI все просто и элегантно! 😊

P.S. Это пример с будущей статьи.
🎉9🔥84👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Привет, друзья! Рад сообщить, что проект, который я недавно анонсировал, завершён. Также готов черновик подробной статьи по разработке. Завтра утром вас ждёт большой гайд по созданию этого проекта. Исходный код и готовый проект в облаке будут доступны в течение нескольких часов. Сейчас пока делюсь демкой
13👍6👏2🤯1
​​Добрый вечер!

После небольшого форс-мажора наконец-то дошли руки до оформления проекта на GitHub, его деплоя и написания этого поста. Рад сообщить, что проект мини-чата на FastAPI полностью завершен!

В процессе разработки я затронул как знакомые темы — работа со статическими файлами, взаимодействие с SQLAlchemy в FastAPI, реализация JWT-токенов, регистрация и аутентификация, — так и продемонстрировал абсолютно новые направления, такие как вебсокеты.

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

Главное — вы поймете, как добавить динамику и реактивность на фронтенд, даже если у вас нет глубоких знаний в разработке пользовательских интерфейсов.

К посту прикреплены ссылки на работающий проект и исходный код на GitHub. Буду очень рад вашей поддержке, так как в этот проект вложено много времени и сил.

При достаточной обратной связи я готов продолжать развивать этот проект и дальше.

До встречи завтра утром на Хабре!
👍20🔥125
Такая вот ситуация...
👏19🔥65🤔1
​​Доброе утро🙋

Рад поделиться отличными новостями — мой проект мини-чата на FastAPI успешно завершен и уже доступен для использования, а обещанная подробная статья про его написание уже опубликована на моем Хабре🎉

В процессе работы я применил множество интересных решений, как знакомых, так и новых. В проекте использованы:

👉 работа со статическими файлами,
👉 интеграция SQLAlchemy в FastAPI,
👉 реализация JWT-токенов, регистрация и аутентификация,

И новый блок:

👉вебсокеты для двустороннего общения.

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

Все ссылки на проект, исходный код на GitHub и сайт с приложением закреплены под этим постом. 🔗

Буду рад вашей поддержке и обратной связи!
👍145🔥4
Незапланированное включение😊

Недавно в сеть вышла новая версия ChatGPT — OpenAI 01. Эта модель способна на глубокие размышления и действительно впечатляет! Я нашел сервис, где можно попробовать эту модель бесплатно. Токенов немного, хватит на 1-2 запроса в день, так что используйте их с умом для действительно важных и сложных задач. Для более простых запросов доступны модели ChatGPT-o и ChatGPT-o-mini.

Переходите по ссылке и пробуйте: OpenAI 01
🔥12👍76😁1
Кто прочитал статью про мини-чат на FastApi. Как вам такой формат публикаций?
👍19🔥8👏3
​​👋 Друзья, всем привет!

Я подготовил для вас новый, полезный и интересный проект! 🚀

В этот раз мы займемся тем, как при помощи чистого JavaScript, HTML и CSS связать форму на веб-странице с Telegram-ботом без использования бэкенда. Да-да, вы не ослышались — никакого бэкенда! 😎

📋 Что это даст?

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

Я уже написал подробную статью на эту тему и планирую выложить её в четверг, 3-го октября. Но, если всё пойдёт по плану, возможно, опубликую раньше. 😉 Обязательно следите за обновлениями, чтобы не пропустить!

🔗 Ссылку на проект с GitHub закрепил под этим постом, переходите и смотрите!👨‍💻
🔥1710👍6❤‍🔥4👎1
Прикольно)
😁8👍5🆒3
Некоторые из вас заметили, что в исходном коде последнего проекта токен не защищен. Это действительно так, и без бэкенда нам не обойтись. В ближайшее время я выпущу обновление, которое устранит эти уязвимости с помощью простого файла на FastAPI.
🔥11👍54
Код проекта обновил на GitHub. Теперь все в безопасности ) единственное что не успел деплой сделать. Обновлённый код презентую сегодня вечером. Всем спасибо за обратную связь.
9👍6🔥5
​​Доброй ночи!

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

Фикс включал добавление простого бэкенда на FastAPI, который выполняет две задачи: рендерит главную страницу (index.html) со статическими файлами и обрабатывает запросы с данными пользователя с формы. Теперь запросы принимаются на специальный эндпоинт, и взаимодействие с Telegram ботом происходит “под капотом”. Таким образом, общая логика осталась прежней, но мы добавили внутреннюю прослойку, скрыв критически важные переменные от посторонних глаз.

Ссылку на работающую страницу с формой и обновленный код проекта на GitHub можно найти под этой публикацией. В новой статье этой проблеме посвящу отдельный блок.
👏10❤‍🔥44🔥3👀1
​​Доброе утро! 🌞

Вчера ночью вносил финальные исправления в статью, описывающую проект по интеграции Telegram-ботов в форму на сайте на чистом JS, и при сохранении черновика случайно нажал «Опубликовать» вместо «Сохранить». В итоге статья вышла на сутки раньше запланированного, но я решил уже ничего не менять. 😅

В рамках этой статьи я сначала продемонстрировал, как просто создать Telegram-бота и с помощью простого JS-скрипта привязать его к форме на сайте. Генерацию фронтенд-части я выполнил на 100% через WebSim. Этот сервис создал форму и расписал логику на простом JS. 📝

Затем я показал, как обезопасить личный токен с помощью простого бэкенда на FastAPI. Весь бэкенд был описан всего в одном файле и выполнял он две задачи: рендеринг страницы с формой и обработка данных с формы на сайте. 🔒

Ссылки на статью, исходный код и работающий проект уже закреплены под этим постом. 📎

Приятного чтения! 😎
🔥11👍43🙈1
У меня появилась идея, которой я хочу с вами поделиться. Давайте поговорим о создании телеграмм-бота с MiniApp — это когда сайт встроен прямо в телеграмм-бота. Это стильно, удобно и красиво. Чтобы выделиться среди подобных статей, я предлагаю вам необычный подход.

Наш бот будет работать на вебхуках, но вместо привычного aiohttp мы будем использовать FastAPI. Почему? Во-первых, FastAPI редко используется для вебхуков, а во-вторых, он поможет нам поднять фронтенд и описать простые API методы.

В итоге у нас получится полноценный сервис: телеграмм-бот на вебхуках с веб-приложением.

Под этим текстом вы найдете кнопку “Прокомментировать”. Нажмите на нее и отправьте свои пожелания по функционалу, который мы будем реализовывать в нашем боте. Давайте не будем придумывать что-то слишком сложное, чтобы всё уместилось в статью.

Жду ваших идей и предложений!
🔥35👍104
Гайд по основным методам ОРМ SQLAlchemy

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

Настройка работы с базой данных
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from your_model import YourModel

engine = create_engine('sqlite:///your_database.db')
Session = sessionmaker(bind=engine)
session = Session()


Основные методы

Получение всех записей
all_records = session.query(YourModel).all()


Получение записи по условию
record = session.query(YourModel).filter_by(id=1).first()


Изменение записи
record = session.query(YourModel).filter_by(id=1).first()
if record:
record.name = 'New Name'
session.commit()


Удаление записи
record = session.query(YourModel).filter_by(id=1).first()
if record:
session.delete(record)
session.commit()


Получение записей с условием
filtered_records = session.query(YourModel).filter(YourModel.age > 30).all()


Получение записей с сортировкой
sorted_records = session.query(YourModel).order_by(YourModel.name).all()


Ограничение количества записей
limited_records = session.query(YourModel).limit(10).all()


Обновление нескольких записей
session.query(YourModel).filter(YourModel.active == False).update({YourModel.active: True})
session.commit()


Удаление нескольких записей
session.query(YourModel).filter(YourModel.age < 18).delete()
session.commit()


Надеюсь, этот гайд будет полезен для вас! Если у вас есть вопросы или предложения, пишите в комментариях. Удачи в кодинге!
❤‍🔥13🔥9👍82
Приколисты)
😁12