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

📬По вопросам: https://t.me/yakvenalexx
🗣Сообщество: https://vk.cc/cxKNTb
Download Telegram
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
Рассказать вам про эту штуку?
👍51💯177🤔5🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Доброй ночи, друзья!

Снова у меня вышла история как пару дней назад — хотел написать небольшой пост, а получился полноценный проект с исходным кодом и живой демонстрацией!

Вчера я спрашивал, интересно ли вам узнать о Centrifugo. Этой теме я и планировал посвятить небольшой материал, но всё вышло масштабнее.

Что в итоге получилось? Real-time опросник с интересной механикой:

1. Заходите на страницу с вопросами
2. Выбираете интересующий вопрос
3. Отвечаете одним из вариантов
4. Попадаете на страницу с результатами

И вот здесь начинается магия — изначально страница загружается с актуальными данными из базы, но если немного подождать, вы увидите как статистика обновляется в реальном времени без перезагрузки страницы. Именно тут на сцену выходит Centrifugo!

Подробный разбор технологии я подготовлю для статьи на Хабре, а пока делюсь с вами:

- Исходным кодом: GitHub

- Рабочей демкой: ДЕМО ПРОЕКТА

Будете ждать полноценную статью? Дайте знать в комментариях!
1🔥62👍197❤‍🔥3
Друзья, приветствую! Черновик готов, но статья пока сырая. Если получится, то сегодня вечером все вычитаю и дополню и завтра релиз на Хабре💪
🔥368👍8❤‍🔥7
Доброе утро, друзья! ☀️

Статья «Centrifugo v6 + FastAPI + Python: разрабатываем веб-опросник с обновлениями в реальном времени» уже опубликована на Хабре! 🎉

🔗 Читать статью: https://habr.com/ru/companies/amvera/articles/885714/

В статье я рассказываю, как с помощью Centrifugo
можно организовать real-time обновления в веб-приложениях. На практике мы разрабатываем интерактивный опросник, в котором статистика ответов обновляется моментально, без перезагрузки страницы.

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

- Centrifugo – отвечает за real-time обновления
- FastAPI – веб-сервер
- SQLite + SQLAlchemy – база данных и ORM
- Tailwind CSS – для стилизации

🔥 Попробовать проект вживую:

- Исходный код: GitHub

- Рабочая демка: ДЕМО ПРОЕКТА

Буду рад вашим комментариям! Как вам такой подход к real-time? 🚀
🔥30👍1612🙏1
Приветствую, друзья. Дошли руки до проекта чата ТетАТет на скринах выше примерный дизайн будущего Telegram MiniApp приложения. Уже все сверстал. Осталось подключить бэкенд
3🔥40👍134👏1
This media is not supported in your browser
VIEW IN TELEGRAM
Друзья, добрый вечер!

Проект чата Тет@Тет на завершающей стадии тестирования и деплоя. Завтра, если найду свободное время, презентую полный исходный код проекта (бэкенд на FastApi + Aiogram 3 и фронтенд на VueJS3) и ссылку на бота.

На представленном видео демонстрация работы бота со стороны фронтенда:

1) Пользователь кликает на «Старт» и отвечает на пару вопросов, называя свой пол, возраст и придумывает никнейм для анонимного чата
2) После входа есть возможность: почитать «о нас», просмотреть профиль, изменить данные в профиле и зайти в MiniApp.

MiniApp – это форма с подбором для фильтрации и сама страница чата. На представленном видео демонстрация общения между двумя аккаунтами.

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

- Redis
- Centrifugo
- SQLite
- FastApi
- Aiogram 3
- SQLAlchemy и прочие технологии бэкенда
- VueJS3 и прочие технологии фронтенда

Как вы видите проект получился мощный, так что буду ждать вашей поддержки.
🔥63👍216👏3