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

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

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

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

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

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

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

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

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

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

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

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

Напоминаю, что это только подготовительный методический материал к большому проекту. Надеюсь, он будет полезен вам!
2🔥49👍1911💘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👍1613🙏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
🎉 Дорогие девушки! 🎉

В нашем мире кода и алгоритмов вас, может, и не так много, но именно вы делаете его ярче, вдохновленнее и интереснее! 💻

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

С 8 Марта! 🌸 Будьте счастливы, любимы и успешны!
27🔥10🥰5❤‍🔥3👍3😁2
Друзья, всем привет. Надеюсь, что соскучились. Ушел с головой в свои проекты, но скоро к вам вернусь с мощным контентом. На очереди Centrifugo, Redis (поделюсь с вами своим авторским BaseDao от мира Redis), VueJS3 и планирую рассказать вам про парочку мощных проектов на основании LLM (нейронок).
👍46🔥188🎉2👏1🍌1
Надеюсь, вы соскучились по такому контенту! 😅 Как вы уже поняли из названия, в первой части я решил сосредоточиться на бэкенде. Мы поговорим о Redis, Centrifugo, FastAPI и ряде дополнительных инструментов.

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

Статья выйдет ориентировочно завтра к обеду.

Исходный код, о котором пойдет речь, доступен здесь: TetAtetChat.

В следующей части мы займемся фронтендом и будем писать MiniApp на Vue.js 3.
2🔥485🎉4👍1🤔1🕊1🙈1
🔥 Друзья, привет! 🔥

На Хабре вышла моя новая статья «Создание анонимного чата в Telegram: Бот с MiniApp интерфейсом. Часть 1 — Бэкенд на FastAPI, Aiogram, Redis и Centrifugo» 🚀

📌 Читаем тут: Хабр

Это первая часть небольшой двухсерийки про разработку Telegram-бота с MiniApp (он же WebApp) в формате анонимного чата «Тет-А-Тет». В этот раз мы полностью разберем бэкенд проекта.

💡 Из статьи вы узнаете:

Как комфортно работать с Redis и зачем он нужен для RealTime-приложений ⚡️
Почему Centrifugo — лучший выбор для этого проекта и как вебсокеты могут быть простыми, если использовать современные инструменты 🔄
В очередной раз затронем SQLAlchemy и его применение в проекте 🛠
Разработаем самого Telegram-бота (пока без MiniApp, этим займемся в следующей части). Бот будет работать на вебхуках с помощью FastAPI 🤖
Сам FastAPI будем использовать для API, обслуживания бота, а также связки с Redis и Centrifugo 🔗

🎯 Даже если сам проект вам не особо интересен, рекомендую ознакомиться со статьей — в ней я делюсь своим опытом работы с Redis (ранее об этом не писал).

📝 Исходный код доступен тут: TetAtetChat 👉 GitHub

В следующей части займемся фронтендом и напишем MiniApp на Vue.js 3 🌐

Буду рад вашей поддержке и обратной связи! Эта работа заняла очень много времени, и мне важно услышать ваше мнение 💬🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥51❤‍🔥16👍163🏆31😱1🙊1
У меня такое случается после пары часов кодинга на VueJS😂
😁52👍6🏆4🐳32🤗2👏1
Друзья, всем привет!

Наконец-то я завершил большой проект – анонимный чат «Тет А Тет» с MiniApp интерфейсом для Telegram! 🚀 Готов поделиться с вами результатами.

📌 Сегодня делюсь ссылками на исходный код проекта и работающего бота. А уже завтра утром выйдет вторая часть статьи, где я подробно расскажу о разработке фронтенда на VueJS3 с Centrifugo и покажу, как реализовать монетизацию бота через RichAds.

💡 Напомню, что в первой части статьи я подробно разбирал бэкенд чата, созданный на FastAPI + Aiogram + Redis + Centrifugo. Разбирали, зачем нужен Redis и Centrifugo для RealTime-приложений, а также пошагово прошлись по всем ключевым моментам серверной части.

🔗 Часть 1 — Разработка бэкенда:

📝 Статья: Создание анонимного чата в Telegram: Бот с MiniApp интерфейсом. Часть 1 — Бэкенд на FastAPI, Aiogram, Redis и Centrifugo

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

🔥 Часть 2 — Разработка фронтенда и монетизация (выходит завтра!):

В статье разберём, как связать фронтенд на VueJS3 с бэкендом на FastAPI, организовать RealTime-общение через Centrifugo, подключить поллинг для поиска собеседников и монетизировать Telegram MiniApp через RichAds. Будет интересно! 😎

💻 Исходный код фронтенда: GitHub

🤖 Попробовать бота: @tet_a_tetMiniAppBot

Оставайтесь на связи – впереди ещё много полезного! 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
427🔥13👍7👏5❤‍🔥3🥰1🎉1😇1😘1
This media is not supported in your browser
VIEW IN TELEGRAM
Друзья, доброе утро!

Встречайте вторую часть серии статей про создание Telegram-бота с MiniApp интерфейсом для реального анонимного чата «Тет А Тет»! 🎉

Статья получила название: «Создание анонимного чата в Telegram: Бот с MiniApp интерфейсом. Часть 2 — VueJS3 + Centrifugo с монетизацией» и уже доступна на Хабре к прочтению.

📌 В этой части мы разберём:

Разработку стильного, анимированного UI на VueJS 3 с real-time чатом.
Мгновенный обмен сообщениями через Centrifugo без лишней нагрузки на сервер.
Монетизацию Telegram MiniApp с помощью умной рекламы от RichAds.
Финальные шаги перед продакшеном и деплой проекта.

🛠 Что мы реализуем?

🔹 Экран загрузки приложения
🔹 Поиск и подбор собеседников
🔹 Экран ожидания
🔹 Сам real-time чат

📌 Основные технологии:

🚀 VueJS 3 — современный JavaScript-фреймворк
📡 Centrifugo — real-time коммуникации
📲 VUE-TG — удобная работа с Telegram MiniApp API
🛤 Vue-Router — маршрутизация

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

🔗 Читать на Хабре:
📌 Часть 1 (Бэкенд): Статья | GitHub
📌 Часть 2 (Фронтенд + Монетизация): Статья | GitHub

🤖 Попробовать бота в Telegram: @tet_a_tetMiniAppBot

Буду рад вашим отзывам! 🚀🔥
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥11❤‍🔥87👏3🤩1👌1👀1
🔥 Фоновые задачи в FastAPI без лишних сложностей 🔥

Ещё раз приветсвую👋 Если вы следите за моим контентом, то знаете, что я уже рассказывал про фоновые задачи в Python с использованием Celery, FastStream и APScheduler. Но что, если хочется чего-то попроще, без брокеров сообщений и дополнительной настройки?

Знакомьтесь: BackgroundTasks в FastAPI! 🚀

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

Как это работает?

1️⃣ Создаем функцию, которая будет выполняться в фоне. Она принимает аргументы, которые передадим при вызове.
2️⃣ Определяем эндпоинт, который будет запускать фоновую задачу.

📌 Пример кода:

from fastapi import FastAPI, BackgroundTasks
import asyncio

app = FastAPI()

async def write_log(message: str):
await asyncio.sleep(5) # Симуляция длительной операции
with open("log.txt", "a") as f:
f.write(f"{message}\n")

@app.post("/start-task/")
async def start_task(background_tasks: BackgroundTasks, msg: str):
background_tasks.add_task(write_log, msg)
return {"message": "Задача запущена в фоне!"}


🔥 Почему это круто?

Простота – не нужно поднимать Redis, RabbitMQ и другие брокеры
Легкость – входит в стандартный функционал FastAPI
Удобство – идеально для небольших фоновых задач, таких как логирование, отправка писем, обновление кеша

Но важно помнить:

📍 BackgroundTasks работают в том же процессе, что и FastAPI, поэтому для более нагруженных задач лучше использовать Celery или другие специализированные решения.

Используете ли вы фоновые задачи в своих проектах? Делитесь опытом в комментариях! 👇🚀
1🔥21👍178🙏1🎄1
Как учитывать просмотры на бэке: быстрый и эффективный способ

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

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

Что нам понадобится:

FastAPI
Любая табличная база данных
Redis

Задача:

Допустим, у нас есть блог, и нам нужно учитывать количество его просмотров. В таблице с блогами есть поле count_views, которое по умолчанию равно 0.

Чтобы не нагружать базу лишними запросами, используем Redis для кэширования информации о том, смотрел ли пользователь этот блог. Ключ формируем так:
redis_key = f"blog_show_{blog_id}_{user_id}"


Логика работы:

1. Проверяем наличие ключа в Redis.
2. Если он есть — пользователь уже смотрел блог, ничего не делаем.
3. Если ключа нет:

- Увеличиваем счётчик просмотров в БД.
- Записываем ключ в Redis с TTL (например, на 1 час).

Код:
@router.post("/edit_blog_show")
async def edit_project_show(
edit_blog_show: EditProjectShow,
redis_client: CustomRedis = Depends(get_redis),
):
redis_key = f"blog_show_{edit_blog_show.blog_id}_{edit_blog_show.user_id}"

exists = await redis_client.exists(redis_key)
if not exists:
async with async_session_maker() as session:
project = await BlogDAO(session).find_one_or_none_by_id(
edit_blog_show.project_id
)
if project:
project.views_count += 1
await session.commit()
await redis_client.set(redis_key, "1", ex=60 * 60)
logger.info(f"Проект {edit_blog_show.project_id} отмечен как просмотрен!")
return {"status": "ok", "msg": "Проект отмечен как просмотрен!"}
else:
logger.warning(f"Проект {edit_blog_show.project_id} уже был отмечен как просмотрен!")
return {"status": "warning", "msg": "Проект уже был отмечен как просмотрен!"}


Этот подход позволяет разгрузить базу и исключить повторные просмотры от одного и того же пользователя в течение заданного периода. Используйте микс Redis и SQLAlchemy для оптимального результата!

🔥 Делитесь своим опытом в комментариях!
2🔥257👍6💘3👏2🍾21
🔥 Анонс новой статьи на Хабре! 🔥

Друзья, скоро на Хабре выйдет мой новый материал, в котором я разберу, как подключить свою базу данных к LLM-моделям вроде Deepseek или GPT.

На простом примере покажу, как это работает:

Собираем текстовые данные (документацию, книги, корпоративную информацию).
Преобразуем их в векторную базу с помощью Python + ChromaDB.
Подключаемся к базе и учим модель искать в ней нужную информацию.
Интегрируем всё с LLM, чтобы получать точные и контекстные ответы.

Где это применимо? В бизнесе, обучении, автоматизации поддержки и не только.

📌 Подробности — скоро на Хабре! Следите за анонсом. 🚀
2🔥7611👍9🎉7🦄2🙏1🤪1