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

📬По вопросам: https://t.me/yakvenalexx
🗣Сообщество: https://vk.cc/cxKNTb
Download Telegram
Друзья, привет всем! 👋

У меня появилась идея для новой статьи, в которой я хочу разобрать Aiogram Dialog и заодно рассмотреть FastStream в связке с RabbitMQ - это современная альтернатива Celery для работы с очередями сообщений.

Планирую создать бота для ресторана с функцией бронирования столиков. FastStream будет использоваться для настройки системы уведомлений. Однако функциональность бота может измениться.

Если вам интересна эта тема, напишите в комментариях, какие функции вы хотели бы видеть в боте, построенном на Aiogram Dialog 👇 Ваши идеи помогут сделать статью более полезной и интересной!
2🔥71👍2610
🚀 Полезный трюк для SQLAlchemy: как быстро преобразовать модель в словарь без использования Pydantic

Друзья, добрый день! 👋

Сегодня хочу поделиться с вами простой наработкой для работы с SQLAlchemy. Если вам часто нужно получать питоновский словарь из результатов запросов, но тянуть Pydantic для этого не хочется, то этот метод как раз для вас! 😎

📌 Решение:

Мы добавляем метод to_dict в базовый класс, от которого будут наследоваться все модели. Этот метод будет преобразовывать модель SQLAlchemy в стандартный Python-словарь, исключая необходимость в Pydantic. Очень удобно, если вы хотите работать с данными без лишних зависимостей.

🛠 Пример реализации:

class Base(AsyncAttrs, DeclarativeBase):
__abstract__ = True

def to_dict(self, exclude_none: bool = False):
"""
Преобразует объект модели в словарь.

Args:
exclude_none (bool): Исключать ли None значения из результата

Returns:
dict: Словарь с данными объекта
"""
result = {}
for column in inspect(self.__class__).columns:
value = getattr(self, column.key)

# Преобразование специальных типов данных
if isinstance(value, datetime):
value = value.isoformat()
elif isinstance(value, Decimal):
value = float(value)
elif isinstance(value, uuid.UUID):
value = str(value)

# Добавляем значение в результат
if not exclude_none or value is not None:
result[column.key] = value

return result


📦 Пример использования:

Теперь вы можете легко использовать этот метод для преобразования данных, полученных из базы:
product_data = await ProductDAO.find_one_or_none_by_id(session=session, data_id=product_id)
product = product_data.to_dict()

Это решение подходит для быстрого и удобного получения данных в формате словаря без лишних зависимостей. Очень полезно для работы с API или при отправке данных в frontend! 💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍169🙏1
🔥 Друзья, всем привет!

Наконец-то записал и опубликовал первое большое видео на Rutube и YouTube! 🎥

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

📌 Почему решил сделать обзор?

На днях я выкатил крупное обновление шаблона, и теперь он стал ещё удобнее и мощнее. Вот ключевые изменения:

- 🔄 Полностью переработал класс `BaseDao`.
Теперь сессия передаётся через конструктор, а не проваливается в каждый метод. Это делает работу с базой данных чище и проще.
- 🛠 Обновил зависимости проекта.
Сделал их более читабельными. Больше никакого сложного класса для генерации сессий — всё максимально понятно.

🎯 В видео я не просто показываю код, но и объясняю, как всё работает.

Там есть:

- 💡 Большой блок о принципах зависимостей в FastAPI.
- 🔐 Подробный разбор защищённой куки-сессии.

Видео получилось объёмным, но очень информативным, так что буду рад вашей обратной связи! 🙏

Смотреть на YouTube: https://www.youtube.com/watch?v=ZSqhCyotcnw

📂 Исходник проекта:

https://github.com/Yakvenalex/FastApiWithAuthSample

Ссылка на видео на Rutube:

https://rutube.ru/video/4b7c69c55c3eaddee7800355c82e55df/

Делитесь впечатлениями и вопросами в комментариях — обсудим! 😉
30👍49🔥2910🎉3🥴1
Друзья, сейчас у меня плотная загрузка по своим проектам, но я приложу все усилия, чтобы к понедельнику подготовить для вас большую и интересную статью о связке Aiogram Dialog с FastStream. Всё под контролем, я помню обо всём! 😉
👍40🔥209❤‍🔥2
🎥 Друзья, у меня появилась идея для видео, и я хочу с вами ею поделиться.

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

Для демонстрации планирую использовать чистый FastAPI, а после показать, как это работает в связке с aiogram.

Вам была бы интересна эта тема в формате видео?
480🔥65👍46💯3🙏2👌1🏆1
Привет, друзья! 🚀

Я только что опубликовал обещанное видео про вебхуки! Материал я постарался сделать максимально понятным и интересным как для новичков, которые впервые слышат о вебхуках, так и для тех, кто уже использовал их в своих проектах.

📽 Что вас ждет в видео?

1️⃣ Теория на пальцах: За пару минут я объясню, что такое вебхуки, и сравню их с поллингом и лонг поллингом. Все просто и доступно!
2️⃣ Практика: Напишем два простых приложения на FastAPI и HTTPX. Первое будет выполнять базовые CRUD-операции, а второе — использовать вебхуки для обработки событий.
3️⃣ Интеграция с Telegram: Покажу, как с помощью вебхуков отправлять уведомления в Telegram-бота. Это просто, но очень полезно для понимания связи между вашим сервисом и внешними системами.
4️⃣ Серьезный бот: В конце реализуем Telegram-бота на aiogram и FastAPI, чтобы вы могли понять, как разрабатываются сложные боты.

К концу видео вы точно разберетесь с вебхуками и сможете применять их в своих проектах!

🔗 Ссылки:

- Видео на YouTube:

https://youtu.be/g4yZDnoVD3g

- Видео на RuTube

https://rutube.ru/video/a686dea056d035b7a4671a515afb3d70/

- Исходный код проекта: GitHub

Если вам понравится видео, буду рад вашей поддержке в виде лайков и комментариев! ❤️

А если хотите поддержать выход подобного контента, вот ссылка: ПОДДЕРЖАТЬ

Обратная связь, вопросы и комментарии👇
31🔥6316🏆6👍5👎1👏1
Приветствую, друзья!

Немного раскидался по своим проектам и появилось время заняться обещанным телеграмм ботом для аренды столиков в выдуманном ресторане.

Напомню, что в этом проекте мы будем использовать следующий стек технологий:

- SQLAlchemy для работы с реляционной базой данных
- Aiogram 3 - фреймворк для разработки телеграм-ботов
- Aiogram Dialog - инструмент, значительно упрощающий работу с машиной состояний
- FastStream - асинхронная замена Cellery, которая в качестве брокера будет использовать RabbitMQ.

Пока ждете материала (надеюсь), подготовил для вас команду, которая позволит быстро поднять RabbitMQ на своей локальной машине.

Для начала установите Docker Desktop на ваш компьютер. После установки и запуска Docker, выполните следующую команду в терминале:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -e RABBITMQ_DEFAULT_VHOST=myapp_vhost rabbitmq:3-management


После успешного выполнения команды, вы сможете получить доступ к веб-интерфейсу управления RabbitMQ по адресу http://localhost:15672/.

Используйте логин "admin" и пароль "password" для входа (данные подставьте свои).

Этот интерфейс предоставит вам удобные инструменты для мониторинга и управления вашим экземпляром RabbitMQ.

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

До скорого!
🔥43👍117
Привет, друзья! 👋

Хочу поделиться с вами полезным лайфхаком! 🎉

Если вы используете виджет Calendar из Aiogram Dialog и хотите, чтобы дни недели и месяцы отображались на русском языке, есть простое решение.

🔧 Как это сделать?

Просто установите русскую локаль при запуске проекта:

Для Windows:
import locale
locale.setlocale(locale.LC_TIME, 'Russian_Russia.1251')



Для Linux:
import locale
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')



После этого календарь будет корректно отображать русские названия месяцев и дней недели. 🗓🇷🇺

🔥 Полный код виджета Calendar:

date_window = Window(
Const("На какой день бронируем столик?"),
Calendar(
id="cal",
on_click=on_date_selected,
config=CalendarConfig(
firstweekday=0,
timezone=timezone(timedelta(hours=3)),
min_date=date.today()
)
),
state=BookingState.date,
)


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

Скоро релиз проекта😉
1🔥29👍137
This media is not supported in your browser
VIEW IN TELEGRAM
Друзья, доброе утро!

Наконец-то дошли руки до завершения проекта телеграм-бота для бронирования столиков в ресторане TableHunter. Встречайте моего нового бота! 🎉

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

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

Стек технологий, который я использовал:

* Брокер сообщений: RabbitMQ (это как почтальон, доставляет сообщения от отправителя к получателю, подробнее расскажу в статье).

* Python технологии:

* Aiogram 3
* Aiogram dialog
* FastAPI (да, снова хуки)
* FastStream (это такой Celery современный)
* APScheduler (отложенные и задачи по расписанию)
* SQLAlchemy (работа с базой данных)

И это еще не всё! Будет интересно!

Вот ссылка на исходный код проекта: GITHUB

Ссылка на работающего бота: https://t.me/tableHanterBot

Постараюсь в ближайшие дни выпустить подробную статью на Хабре.
5🔥69👍216👏2🍾2🎉1
Друзья, привет! 👋

Решил ещё немного замотивировать вас учить SQLAlchemy 2 одним примером из реальной практики.

📌 Представим, что у нас есть большое количество категорий, и появилась необходимость дополнительно добавить SLUG – латинское представление имени категории для улучшения SEO.

Вот как можно реализовать эту задачу:

import asyncio
from transliterate import translit
from app.dao.database import async_session_maker
from app.products.dao import CategoryDAO
import re

async def slugify_category():
async with async_session_maker() as session:
categories = await CategoryDAO(session).find_all()
for category in categories:
# Транслитерация названия категории
transliterated = translit(category.name, 'ru', reversed=True)
# Приведение к нижнему регистру и замена пробелов на дефисы
slug = re.sub(r'[^a-z0-9\-]', '-', transliterated.lower())
slug = re.sub(r'-+', '-', slug).strip('-') # Убираем лишние дефисы
category.slug = slug
await session.commit()

asyncio.run(slugify_category())


💡 В этом процессе мы загружаем полные записи (скаляры) из базы данных, после чего можем работать с каждой строкой таблицы категорий как с полноценным объектом Python. Это позволяет применять к данным любую необходимую логику преобразования, а затем зафиксировать изменения в базе.

🔥 Теперь ваши категории получат красивые и удобные для SEO slug-и! Надеюсь, этот пример был полезен. Делитесь в комментариях, используете ли вы транслитерацию в своих проектах! 🚀
🔥22👍188
Материала получилось очень много, но, надеюсь, что оно того стоило. Если успею вычитать все, то публикация завтра.
🔥44👍177❤‍🔥1👎1
Друзья, доброе утро! ☀️

🎉 Обещанная статья про разработку телеграм-бота для бронирования столиков в нашем выдуманном ресторане уже опубликована на Хабре!

📖 Статья называется: «Телеграм-бот для бронирования столов на вебхуках: FastAPI, Aiogram Dialog, FastStream и RabbitMQ в единой экосистеме». В ней я подробно рассматриваю фреймворк Aiogram Dialog в связке с Aiogram 3, а также уделяю много внимания брокеру сообщений RabbitMQ и его практическому применению с FastStream.

💡 Если вы хотите разобраться с темой брокеров сообщений и их использованием, эта статья станет отличным методическим источником!

🔗 Ссылка на статью: Читать на Хабре

🔗 Ссылка на проект на GitHub

🔗 Ссылка на работающего бота: Запустить бота

🙏 Очень надеюсь на вашу обратную связь и поддержку, особенно на Хабре. На разработку этого проекта и написание статьи ушло много времени, и без вашей поддержки у меня просто не будет мотивации создавать подобный контент💬
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍44🔥2512🎉2👏1
Привет всем👋

Я к вам с анонсом нового проекта для большой статьи под Хабр!

Давно я хотел реализовать телеграмм бота с MiniApp, где можно будет создать чат со случайным пользователем. Вы помните старый чат «Тет-А-Тет»? Вот примерно то же самое, но уже в формате телеграмм бота с MiniApp.

Суть проекта:

- Фильтры и соединение: Вводите фильтры и нажимаете кнопку.
- Случайное общение: Вас соединяют со случайным пользователем для общения.
- Гибкость: Каждый пользователь может прервать общение и открыть новый рандомайзер.

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

Стек технологий:


- Фронтенд: VueJS
- Бэкенд: FastAPI + Aiogram 3

Кроме того, бонусом, я планирую показать простой способ монетизации MiniApp приложений.

Будете ждать статью?
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍103🔥3020
Когда горишь своим делом😂
😁51🤣31🔥10💯5👍1
32 года: Время для размышлений и благодарности 🤍

Сегодня мне исполнилось 32 года🍰 Сижу и думаю о том, как далеко я зашел. Когда-то я просто писал код для себя, а теперь веду блог на Хабре и канал, где уже почти 2700 человек. Это как маленькая армия разработчиков, с которыми мы вместе изучаем Python и все, что с ним связано 🐍

Путь от джуна до эксперта

32 года — это вроде бы еще молодость, но уже не вчерашний джун😄 За эти годы я осознал одну простую истину: делиться знаниями — это действительно круто. Это как лайфхак для получения быстрого буста в технологиях, о которых пишешь. Пишешь код, он работает — слава Богу! Но с ростом аудитории приходит и ответственность. И за это я хочу сказать огромное спасибо вам, друзья!

Благодарность за поддержку

Спасибо за вашу поддержку, за то, что верите в меня и позволяете мне быть собой. Каждый ваш комментарий, лайк или даже спор под статьей мотивирует двигаться дальше и развиваться.

Что впереди?

📌 Что дальше? Да кто его знает! Наверное, нас ждут еще больше статей, новых идей и экспериментов. Если у вас есть темы, которые вы хотите разобрать — пишите! А пока я отмечаю свой день рождения с мыслями о том, что все только начинается.

Спасибо всем вам за то, что читаете меня и поддерживаете. Вы — настоящая огненная команда🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
20111🍾46🎉43🔥18👍4🙏2
🚀 Потихоньку двигаюсь дальше с разработкой чата со случайными пользователями на базе Telegram Mini App

Решил подробнее рассказать о технологиях и функционале будущего бота.

🔹 Технологический стек:

— FastAPI + WebSockets для мгновенного обмена сообщениями
— Redis в роли очереди для матчмейкинга
— PostgreSQL для хранения истории чатов и данных пользователей
— Vue 3 + Pinia для удобного управления состоянием на фронте
— Telegram Web Apps API для интеграции с Telegram MiniApps

Как видите, стек мощный — будет интересно! 😎

💰 Монетизация

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

В качестве рекламной платформы рассматриваю RichAds — у них есть отличные инструменты для интеграции рекламы в Telegram MiniApps. Сервис удобен как для размещения рекламы других проектов, так и для монетизации собственного контента. В статье подробно разберу этот процесс на практике.

Следите за обновлениями, скоро будет больше деталей! 🔥
🔥32👍157😍2
Как Docker помог масштабировать обновление остатков и цен 📚💻

Продолжаю делиться интересными кейсами из своего боевого опыта кодинга😅 Если коротко, есть один проект - он обслуживает почти 1 млн книг с таких площадок, как Читай Город, Озон, Лабиринт, WB.

Процесс работает в двух направлениях:

🔹 Сбор информации — парсинг, актуализация остатков и цен.
🔹 Обслуживание магазинов клиентов — управление их товарами на Озоне и Wildberries.

🔥 Проблема

Когда у тебя 70+ работающих магазинов, задача обновления цен и остатков становится непростой. Вкратце, процесс такой:

1️⃣ Берем товары из магазина клиента.
2️⃣ Запрашиваем актуальные данные через сайт-донора.
3️⃣ Обновляем остатки и цены в магазине.

Скрипт простой, но при таком масштабе нужно решение, которое обеспечит скорость и стабильность.

🚀 Решение — Docker

Я создал универсальный Docker-образ, который принимает параметры конкретного магазина и запускает процесс обновления. Далее просто поднял 70 контейнеров — каждому магазину свой изолированный контейнер и прокси-сервер.

📦 Что это дало?

Независимость магазинов друг от друга.
Минимальные накладные расходы на управление.
Гибкость и легкость в масштабировании.

В итоге процесс стал быстрее и стабильнее, без риска завалить всю систему.

Docker — 🔥 инструмент, если его правильно использовать. Особенно, когда дело касается масштабирования задач. 😉
🔥32👍196
Друзья, добрый вечер!

Сегодня я хочу поделиться с вами незапланированным контентом. Утром мне пришла в голову идея написать короткий пост о том, как работают вебсокеты в FastAPI. Однако, по мере работы, материал разросся до полноценного проекта!

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

Итак, представляю вам небольшой учебный проект, который поможет вам понять, как работают вебсокеты в формате FullStack приложения. Я намеренно сделал его простым, избегая сложностей с базами данных и избыточной валидацией. Рассматривайте его как дополнительный методический материал к большой статье на Хабре о телеграм-боте с MiniApp и анонимным чатом «Тет-а-Тет».

На данный момент я уже:

1. Подготовил код для проекта.
2. Задеплоил его.
3. Записал видео по проекту.
4. Подготовил черновик статьи для Хабра. Если все пройдет по плану, завтра я поделюсь с вами этой статьей.

Вот ссылки на материалы:

- Видео на YouTube: [Смотреть здесь]

- Видео на RuTube: [Смотреть здесь]

- Проект на GitHub: [Посмотреть код]

- Работающий чат: [Попробовать чат]

Напоминаю, что это только подготовительный методический материал к большому проекту. Надеюсь, он будет полезен вам!
2🔥49👍1910💘1
🚀 Новый гайд: Вебсокеты + FastAPI – создаем чат с комнатами!

Друзья, привет! 👋

На Хабре вышла моя новая статья, в которой я подробно и доступно объясняю, как работают вебсокеты в связке с FastAPI. Мы разберем не только теорию, но и применим знания на практике, реализовав полноценный чат с поддержкой комнат и возможностью подключать неограниченное число пользователей.

🔹 Кому будет полезно?

Материал отлично подойдет новичкам, но и опытные разработчики смогут найти для себя полезные инсайты.

🔹 Что используем?

FastAPI + WebSockets – для серверной части и работы в реальном времени
JavaScript – для установления соединений и динамики на странице
TailwindCSS – для быстрой и удобной стилизации
HTML + Jinja2 – для рендеринга страниц

💡 Бонус: Этот гайд — подготовка к большой статье о создании Telegram-бота с MiniApp и анонимным чатом «Тет-а-Тет»!

📖 Читать статью: "Вебсокеты на FastAPI: Реализация простого чата с комнатами за 20 минут"

🎥 Видео разбор: YouTube | RuTube

💻 Код проекта: GitHub

🔥 Попробовать чат в деле: ЧАТ

Буду рад вашей поддержке, комментариям и обратной связи! 🚀
2🔥4511👍82
Друзья, привет! 🌟

Решил рассказать о том, как кэширование с использованием Redis может значительно ускорить ваши FastAPI приложения.

Представьте, что у вас есть метод, который возвращает многоуровневую структуру каталога для интернет-магазина. Формирование ответа занимает целых 3 секунды — это слишком долго! Решение простое: кэширование!

Как работает кэширование с Redis в FastAPI:

1. Первый запрос:

- Проверяем наличие данных в Redis по определенному ключу.
- Если данных нет, выполняем тяжелый запрос к базе данных.
- Сохраняем результат в Redis с временем жизни (TTL) 1 час.
- Возвращаем данные пользователю.

То есть. Тот кто первый выполнит запрос, тот и возьмет на себя всю нагрузку.

2. Следующие запросы в течение часа:

- Снова проверяем Redis.
- Если данные есть, возвращаем их без обращения к БД.
- Через час Redis автоматически удаляет старые данные.

Шаги для реализации:

1. Запуск Redis:

Используйте Docker для запуска контейнера Redis:

docker run -d --name redis_container -p 6379:6379 -v redis_data:/data redis:latest


2. Установка библиотек:

Установите необходимые зависимости:

   redis==5.2.1
fastapi-cache2==0.2.2
uvicorn==0.31.0
fastapi==0.115.0
aioredis==2.0.1


Пример кода:

Опишите жизненный цикл вашего FastAPI приложения и включите Redis с кэшированием:

from fastapi import FastAPI, Depends
from fastapi_cache import FastAPICache
from fastapi_cache.backends.redis import RedisBackend
import aioredis
from contextlib import asynccontextmanager
from fastapi_cache.decorator import cache

@asynccontextmanager
async def lifespan(app: FastAPI):
redis = await aioredis.from_url("redis://localhost", encoding="utf8", decode_responses=True)
FastAPICache.init(RedisBackend(redis), prefix="api:cache")
yield


app = FastAPI(lifespan=lifespan)


@app.get('/tree')
@cache(expire=3600)
async def get_category_tree(session: AsyncSession = Depends(get_session_without_commit)):
return await CategoryDAO(session).find_category_tree()


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

Если у вас есть вопросы или хотите обсудить детали реализации — пишите в комментариях! 🚀
🔥31👍196