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

📬По вопросам: https://t.me/yakvenalexx
🗣Сообщество: https://vk.cc/cxKNTb
Download Telegram
В планах есть статья, в которой я снова расскажу про авторизацию и аутентификацию с использованием FastAPI. В этом материале, помимо входа через смс и почту, я планирую описать работу с JWT токенами через Bearer, а не через куки.

Если вам интересно почитать уже сейчас про авторизацию и аутентификацию с JWT через куки, рекомендую заглянуть в мою статью на Хабре: Создание собственного API на Python (FastAPI): Авторизация, Аутентификация и роли пользователей.

P.S. На скрине внешний вид Swagger-документации в котором уже используется данный подход.
3🔥46👍178
Друзья, я тут обзавёлся одной интересной штукой, так что, в ближайшее время, ждите контент в новом формате 😉
🔥69🎉146👍6👎1
Вторая часть проекта, посвященная разработке FullStack приложения для выдуманной клиники "Здоровье Плюс" уже оформлено в черновик.

Если успею за сегодня все вычитать, то завтра публикация.

В статье подробно описал процесс создания фронтенда для Telegram MiniApp, написанного на чистом Vue.JS 3.

Будете ждать выхода?
2🔥74👍18🎉71
Друзья, привет!

Рад поделиться с вами второй частью из мини-серии статей по созданию телеграм-бота с Mini App для вымышленной клиники «Здоровье плюс».

Новая статья уже опубликована на Хабре и получила название:
«FastAPI и Vue.js 3: телеграм-бот с Mini App для записи и автоматических уведомлений. Пишем фронтенд».

На этот раз я сосредоточился исключительно на разработке фронтенда — без кода на Python.

В статье детально разобрал процесс создания полноценного Single Page Application с использованием современного фреймворка Vue.js 3
. Для стилизации проекта применял Tailwind CSS.

Я постарался сделать материал доступным даже для тех, кто только начинает знакомство с фронтендом или Vue.js 3. Вы найдете пошаговые инструкции, которые помогут создать Mini App для нашего бота.

🔗 Cсылки👇
7👍26🔥1510
Друзья, привет всем! 👋

У меня появилась идея для новой статьи, в которой я хочу разобрать 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