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

📬По вопросам: https://t.me/yakvenalexx
🗣Сообщество: https://vk.cc/cxKNTb
Download Telegram
Друзья, добрый вечер! 😎 Надеюсь, что соскучились? 😏 Я немного увяз в рабочих проектах, но теперь, немного раскидавшись, анонсирую вторую часть из серии «Личный ИИ-ассистент на ваших данных»!

К концу недели опубликую на Хабре продолжение, в рамках которого мы будем разрабатывать полноценный веб-интерфейс для нашего ИИ-ассистента.

Для тех, кто пропустил: в первой части мы создали собственную векторную базу данных, используя личную информацию, и разобрались, как интегрировать её с нейросетями DeepSeek и OpenAI. Пока всё работало в консольной версии, но это уже был важный шаг вперёд!

Теперь мы реализуем веб-интерфейс с поддержкой стриминга ответов, как в чате ChatGPT, используя Centrifugo V6, чтобы ИИ выдавал текст постепенно — плавно и без долгих ожиданий. Также добавим простую систему авторизации для безопасного доступа и возможность выбора между моделями DeepSeek и ChatGPT прямо в интерфейсе.

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

Будет, как минимум, интересно так что следите за обновлениями! 🔥
2🔥5815👍1261🙈1😇1
🚀 Как конвертировать XML в JSON на Python. Простой и удобный способ 🔄

Привет, друзья! Недавно столкнулся с задачей трансформации XML-файлов в читаемый JSON — решил поделиться рабочим решением 💡

📦 Установим пару библиотек:

pip install xmltodict chardet


- xmltodict — превращает XML в питоновский словарь (json)
- chardet — автоматически определяет кодировку файла (важно для кириллицы)

🛠 Что умеет скрипт:

Автоматически определяет кодировку XML
Конвертирует структуру XML в JSON
Поддерживает кириллицу и спецсимволы
Генерирует читаемый JSON с отступами

📄 Пример скрипта:

import xmltodict
import json
import os
import chardet

def detect_encoding(file_path):
with open(file_path, "rb") as file:
raw_data = file.read()
result = chardet.detect(raw_data)
return result["encoding"]

def xml_to_json(xml_file_path):
try:
if not os.path.exists(xml_file_path):
print(f"Ошибка: Файл {xml_file_path} не найден")
return

encoding = detect_encoding(xml_file_path)
print(f"Определена кодировка файла: {encoding}")

with open(xml_file_path, "r", encoding=encoding) as xml_file:
xml_content = xml_file.read()

xml_dict = xmltodict.parse(xml_content)

json_file_path = os.path.splitext(xml_file_path)[0] + ".json"
with open(json_file_path, "w", encoding="utf-8") as json_file:
json.dump(xml_dict, json_file, ensure_ascii=False, indent=4)

print(f" Файл успешно сохранён как {json_file_path}")

except Exception as e:
print(f" Ошибка при преобразовании: {str(e)}")

if __name__ == "__main__":
xml_file_path = "my_file.xml"
xml_to_json(xml_file_path)


📎 Подходит как для небольших XML-файлов, так и для массивных выгрузок (сегодня делал тест на файле 200мб + - летает).
🔥35👍1733
This media is not supported in your browser
VIEW IN TELEGRAM
Друзья, приветствую! К сожалению, не успеваю с публикацией полноценной статьи на сегодня, но сам проект практически готов.

На приложенной анимации вы можете увидеть, как работает чат на данный момент.

Есть выбор между ChatGPT и Deepseek, ответ подгружается в формате стриминга (чанками).

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

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

Сегодня делюсь с вами кодом проекта.
3👍32🔥1972🥰2😱1😇1
🚀 Проект готов! Личный ИИ-ассистент на ваших данных

Друзья, рад поделиться хорошими новостями — мой проект по созданию персонального ИИ-ассистента завершён! Он работает на базе ваших собственных данных с использованием ChromaDB + DeepSeek | GPT.

🧠 Пока вторая часть статьи ещё в процессе написания, но не терпится показать вам результат. Ниже — видео с демонстрацией, а также доступ к исходному коду.

🎥 Видео-демо веб-интерфейса и возможностей ассистента:

▶️ YouTube: Смотреть на YouTube
📺 RuTube: Смотреть на RuTube

📖 Если ещё не читали первую часть статьи — рекомендую начать с неё:
«Личный ИИ-ассистент на ваших данных. Часть 1: Векторная база ChromaDB + DeepSeek | GPT»

💻 Исходный код проекта (вся логика из видео и статьи):
🔗 GitHub: ChromaDBGPTDeepSeek — article_2

Буду рад вашим вопросам, идеям и обратной связи — присоединяйтесь к обсуждению! 💬
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍38🔥278🤮1💋1🤪1
Материал второй части готов. Постараюсь опубликовать его завтра, если сегодня найду время на вычитку.
4🔥28👍15❤‍🔥51😁1😱1🤮1😍1
This media is not supported in your browser
VIEW IN TELEGRAM
🌅 Доброе утро, друзья!

Как и обещал, на Хабре вышло продолжение серии про создание ИИ-ассистента на собственной базе знаний!

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

🔐 В этой части я также показал новый подход к реализации системы JWT-авторизации — просто, прозрачно и удобно.

💡 Сейчас в проекте задействованы две нейросети: DeepSeek и ChatGPT. Всё работает через стриминг, интерфейс аккуратный и современный. Думаю, вам понравится.

📖 Читайте статью:
👉 Личный ИИ-ассистент на ваших данных. Часть 2: Веб-интерфейс, авторизация и стриминг ответов от ИИ

💻 Исходники проекта (вся логика из обеих частей):
🔗 GitHub: ChromaDBGPTDeepSeek — article_2

Как всегда, буду рад вашей поддержке, комментариям и обратной связи 🙌
4🔥52👍1562👏2😁2🤗1
👋 Друзья, привет!

Ловите небольшой лайфхак для тех, кто работает с FastAPI.

Иногда возникает необходимость скрыть отдельные методы из Swagger-документации (автоматически генерируемого интерфейса). Например, если у вас есть служебные эндпоинты, которые не стоит светить наружу.

Вот как это легко сделать 👇

@router.post("/secret/", include_in_schema=False)
async def my_secret():
# Ваш код здесь
pass


💡 Ключевой параметр — include_in_schema=False. Он говорит FastAPI не включать метод в OpenAPI-схему, а значит, и в Swagger он не попадёт.

Пользуйтесь! 🚀
2👍7815🔥11🐳311👾1
Друзья, приветствую! Готовы к рассмотрению новой технологии в связке с FastApi? 😉
3👍110🔥327🤪32🎉2🤝1🦄1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Интеграция Keycloak с FastAPI — просто о безопасности

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

В честь 1 мая — Дня труда, решил не отдыхать, а поделиться полезной темой: интеграция Keycloak с FastAPI.

Для тех, кто не знаком: Keycloak — это мощная open-source система управления пользователями, авторизацией и SSO. Минимум кода — максимум защиты. Используется даже в банковских продуктах благодаря своей стабильности и гибкости.

📽 В видео, которое прикрепил к посту, вы увидите простой сценарий:

1️⃣ Пользователь с фронта перенаправляется на страницу авторизации Keycloak
2️⃣ Проходит регистрацию или вход
3️⃣ После успешного логина — возвращается в приложение с нужными токенами

🔗 Код из демонстрации доступен тут:
https://github.com/Yakvenalex/KeycloackFastApi

💡 Сейчас думаю собрать небольшой pet-проект — "хранилище мыслей" с авторизацией через Keycloak, и заодно оформить это в статью на Хабр. Если тема вам зайдёт — углубимся в детали: роли, группы, refresh токены, разграничение доступа и многое другое.

📬 Пишите в комментарии, если интересно. Будем разбирать вместе!

P.S. Всех с 1 мая! Хорошего настроения, и пусть труд будет в радость — особенно, если это труд по внедрению безопасных решений 😉
548👍42🔥19🎉3❤‍🔥21🍌1💋1
🚀 FastAPI + Keycloak: готовый проект и видеообзор

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

Я подготовил для вас демо-проект, который показывает, как можно реализовать авторизацию с помощью Keycloak в связке с FastAPI в своем веб-приложении.

🔍 Чтобы проще разобраться, как всё работает, я записал короткий видеообзор — смотрите на удобной вам платформе:

📺 YouTube – https://www.youtube.com/watch?v=YyeB4NjWMHY&t=2s

📺 RuTube – https://rutube.ru/video/84b5021cadd5033c441ba43adcd166a8/

💡 Проект — это простое CRUD-приложение для заметок. Но основной акцент — на реализации авторизации через Keycloak.

Вот как работает процесс:

1. Пользователь переходит на страницу Keycloak (готовая форма авторизации/регистрации).

2. После входа происходит редирект обратно в ваше приложение с одноразовым кодом.

3. Приложение получает код и отправляет его обратно в Keycloak.

4. В ответ возвращаются access_token, refresh_token и id_token, которые можно сохранить в куках.

5. Далее эти токены используются для доступа к защищённым маршрутам.

🔐 Возможности Keycloak:

💎 формы регистрации/входа «из коробки»

💎 внутренняя база пользователей

💎 интеграция с email-рассылкой

💎 поддержка множества внешних провайдеров авторизации: GitHub, Google и многие другие.

🎥 В видео — демонстрация процесса. А более подробный разбор кода будет в моей статье на Хабре (скоро!).

📦 Исходный код проекта на GitHub:
🔗 github.com/Yakvenalex/KeycloackFastApi

Если остались вопросы или есть пожелания — пишите в комментариях!
Please open Telegram to view this post
VIEW IN TELEGRAM
4❤‍🔥32🔥24👍143🫡2😍1🎃1
Друзья, добрый день!

Рад поделиться с вами завершённым проектом на связке Keycloak + FastAPI, который подробно описан в моей новой статье на Хабре.

В статье я разбираю простой CRUD-приложение для заметок с реализацией полноценной авторизации через Keycloak - от формы входа и регистрации до работы с access и refresh токенами.

Что внутри статьи?

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

Статья называется:

«FastAPI + Keycloak: Простая и безопасная авторизация в веб-приложении на примере реального проекта» и уже доступна на Хабре.

Полезные материалы:

💎 Статья на Хабре: https://habr.com/ru/companies/amvera/articles/907990/

- Короткий видеообзор, где я показываю работу проекта на практике:

💎 YouTube: https://www.youtube.com/watch?v=YyeB4NjWMHY&t=2s
💎 RuTube: https://rutube.ru/video/84b5021cadd5033c441ba43adcd166a8/

💎 Исходный код проекта на GitHub: https://github.com/Yakvenalex/KeycloackFastApi

Если у вас возникнут вопросы или предложения - пишите в комментариях, буду рад помочь!
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍39🔥216🙏2🏆2👏1💋1
👋 Друзья, привет!

Хочу поделиться небольшой, но полезной наработкой для тех, кто работает с Telegram-ботами и отправкой изображений.

Ситуация:

У вас есть backend, на котором лежат изображения. Вы пытаетесь отправить их в чат бота с помощью bot.send_photo, передавая прямую ссылку (image_url) — но Telegram отвечает чем-то вроде:

Bad Request: wrong type of the web page content

Такое часто бывает, если:

* домен нестандартный (например, через туннель или локальный IP)
* сертификат Telegram не устраивает
* или просто он не может скачать файл напрямую.

🎯 Решение — скачать изображение вручную и отправить его как байты:

import aiohttp
from aiogram.types import BufferedInputFile

async def send_photo_from_url(chat_id, image_url, caption=None, parse_mode="HTML"):
    async with aiohttp.ClientSession() as session:
        async with session.get(image_url) as resp:
            if resp.status != 200:
                raise Exception(f"Image load failed: {resp.status}")
            img_bytes = await resp.read()
            image = BufferedInputFile(img_bytes, filename="image.jpg")
            await bot.send_photo(
                chat_id=chat_id,
                photo=image,
                caption=caption,
                parse_mode=parse_mode,
            )


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

Надеюсь, пригодится!
👍36🔥237❤‍🔥1💘1
💭 А что, если пойти дальше?

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

форматированного текста
📸 изображений
📎 файлов
🔒 авторизации
🕒 планирования по времени

Всё это — через удобную, современную админку. Никаких команд в терминале — всё в пару кликов.

⚙️ Хочу рассказать, как реализовать такую систему на базе FastAPI, Aiogram 3 и SQLAlchemy, с гибкой очередью сообщений и полной готовностью к продакшену. Авторизацию можно будет снова сделать через Keycloak.

Будете ждать такую статью?
2🔥124👍3711🤩3🤪3👎1🎄1
Генерация SSH-ключа на VPS и привязка к GitHub — быстро и просто 🚀

Чтобы работать с GitHub с VPS удобно и безопасно, без постоянного ввода логина и пароля, рекомендую настроить SSH-доступ. Это просто:

1️⃣ Создаём SSH-ключ (рекомендуется Ed25519):
Откройте терминал на сервере и выполните:

ssh-keygen -t ed25519 -C "ваш_email@example.com"


2️⃣ Используем стандартный путь (\~/.ssh/id\_ed25519):
Нажмите Enter при запросе пути. При желании задайте пароль — или оставьте пустым для удобства.

3️⃣ Копируем публичный ключ:

cat ~/.ssh/id_ed25519.pub


4️⃣ Добавляем ключ в GitHub:
GitHub → Settings → SSH and GPG keysNew SSH key
Вставьте ключ, дайте название (например, My VPS) и сохраните.

5️⃣ Проверяем подключение:

ssh -T git@github.com


Если увидите сообщение вроде “Hi username! You've successfully authenticated” — всё работает

Теперь можно клонировать репозитории по SSH:

git clone git@github.com:username/repository.git


Важно! Убедитесь, что ссылки на репозитории в ваших проектах тоже используют SSH, а не HTTPS. Это можно проверить и изменить так:

🔄 Проверить текущую ссылку:

git remote -v


🔧 Изменить на SSH-ссылку:

git remote set-url origin git@github.com:username/repository.git


Теперь вы готовы работать с репозиториями без лишней головной боли — быстро, безопасно и без постоянного ввода логина/пароля 💻🔐
👍25🔥95🎉1
Полное руководство по настройке CI/CD для проектов на VueJS3 и FastAPI

Я подготовил небольшую, но ёмкую инструкцию по работе с технологией GitHub Actions. Если кратко, эта технология позволяет при пуше в репозиторий на GitHub автоматически запускать процессы, которые обновляют ваше приложение на VPS-сервере.

В руководстве я описал два простых примера: один - с использованием systemd для FastAPI, другой - с чистым Nginx для VueJS3. При этом GitHub Actions отлично подходит и для более сложных связок, например, с Docker.

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

Полная инструкция доступна по ссылке: yakvenalex.ru/ru/all_technology/ci-cd-guide
🔥37👍1272🍾2🤪1
Простой способ скрывать автоматизацию браузера при работе с Playwright

Если вы используете Playwright для автоматизации браузера и хотите, чтобы сайты не определяли, что вы — бот, есть простой и эффективный трюк.

Шаг 1. Установка Playwright и драйверов

pip install playwright==1.52.0  # или более новую версию
playwright install # установка всех драйверов
# или для конкретного браузера:
playwright install chromium # драйвер для Chrome/Chromium


Шаг 2. Пример скрипта с обходом детекции автоматизации

import asyncio
from playwright.async_api import async_playwright

async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False,
channel="chrome",
args=["--start-maximized", "--disable-blink-features=AutomationControlled"],
)
context = await browser.new_context(no_viewport=True)
page = await context.new_page()
await page.goto("https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html")
await page.wait_for_timeout(5000) # пауза 5 секунд для просмотра результата
await context.close()

if __name__ == "__main__":
asyncio.run(main())


Почему это работает?

- Аргумент --disable-blink-features=AutomationControlled отключает встроенную в Chromium функцию, которая обычно выдаёт факт автоматизации (например, свойство navigator.webdriver).
- Запуск браузера с этим параметром помогает скрыть автоматизацию от сайтов, которые пытаются определить ботов.
- Сайт intoli.com отлично подходит для проверки, видит ли сайт, что вы используете автоматизацию.

Этот простой приём помогает значительно снизить риск блокировок и детекций при автоматизации через Playwright. Попробуйте и убедитесь сами!
126👍24🔥16🎄1🙉1
Легкий путь в Python
💭 А что, если пойти дальше? Вместо того чтобы вручную возиться с кодом, почему бы не создать полноценный веб-интерфейс для отправки отложенных сообщений в Telegram — с поддержкой: форматированного текста 📸 изображений 📎 файлов 🔒 авторизации 🕒 планирования…
Друзья, надеюсь соскучились. Скоро к вам вернусь. Надеюсь, что следующий месяц будет свободнее. На очереди, как и говорил, проект с веб-интерфейсом для телеграмм бота. Постараюсь к концу следующей недели выйти с новым материалом на Хабре.
🔥6415👍10❤‍🔥8👀2🤯1😱1
🧵 Бывает, нужна pydantic-модель… но лезть в schemas.py лень, да и незачем

В таких случаях на помощь приходит create_model из Pydantic 🧙‍♂️
Это отличный способ создать модель на лету, особенно когда нужно:

* собрать фильтр для DAO,
* подготовить временную обёртку под данные,
* протестировать какой-то кусок бизнес-логики без лишней бюрократии.

🛠 Ниже — 3 удобных способа использования create_model

1. 📦 Обычное создание класса + отдельный вызов

from pydantic import create_model

FilterModel = create_model('FilterModel', id=(int, ...))
filter_model = FilterModel(id=child_id)


Подходит, если модель будет использоваться более одного раза
🧠 Имя 'FilterModel' здесь не просто строка — оно будет видно в логах, исключениях и IDE-подсказках, что может сильно облегчить отладку.

2. ⚡️ Создание и вызов — в одной строке, с именем

from pydantic import create_model

filter_model = create_model('FilterModel', id=(int, ...))(id=child_id)


Удобно, если модель используется один раз, но вы всё же хотите, чтобы она имела осмысленное имя (для дебага или логирования).

3. 🎭 Максимально лаконично — без имени

from pydantic import create_model

filter_model = create_model('', id=(int, ...))(id=child_id)


Идеально для разовых задач, тестов, временных скриптов
⚠️ Но без имени будет сложнее отследить, если модель "взорвётся" в логах или ошибках.

💡 Напоминаю: create_model создаёт полноценную BaseModel, так что она полностью совместима с остальной экосистемой Pydantic — включая .model_dump(), валидацию, .model_json(), .model_fields, и так далее.

👨‍💻 Используйте этот приём, чтобы писать чище, быстрее и без лишнего шума в кодовой базе.
👍235🔥42👎1🍌1🤝1🫡1
🔧 Git: "Не могу запушить!" - Простое решение конфликта веток

😱 Что случилось?
Вы сделали коммит, пытаетесь сделать git push и получаете ошибку (вместо main имя ветки в которую вы пушили):
! [rejected] main -> main (non-fast-forward)


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

🎯 Простое и безопасное решение

Шаг 1: Скачиваем новые изменения
git pull --rebase origin main

Эта команда скачает чужие изменения и попытается поставить ваш коммит поверх них


Если конфликтов НЕТ:
Git выведет что-то вроде:
Successfully rebased and updated refs/heads/main.
Успешно перемещён и обновлён refs/heads/main.


Переходите сразу к Шагу 5!
🚀

Шаг 2: Если появились конфликты

Git покажет что-то вроде:
CONFLICT (content): Merge conflict in file.py


Шаг 3: Решаем конфликты (если они есть)

1. Открываем файл с конфликтом
2. Ищем строки с <<<<<<<, =======, >>>>>>>
3. Оставляем нужный код, удаляем служебные символы
4. Сохраняем файл

Шаг 4: Завершаем (только при конфликтах)
git add .
git rebase --continue


Шаг 5: Пушим результат
git push origin main


Готово!
Ваши изменения теперь в репозитории поверх всех остальных.

🆘 Если запаниковали
git rebase --abort

Вернет все как было до начала операции


💡 Главное: не паникуйте! Эта ошибка - норма в командной работе.
2🔥36👍14122😍2👏1🍌1
Небольшая зарисовка о работе после интеграции в командную строку Claude Code 😂
😁15😱7👍5🔥53🎄3🤝1