BoCoder | Путь в IT
474 subscribers
517 photos
7 videos
3 files
412 links
Всем привет!
Здесь про мой путь в IT и саморазвитие

Мои социальные сети и сеть каналов
@BoCoder_Perehodnik


Админ/Связь: @BoCoder_Work
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Итоги дня:

🔺Изучение FastAPI

Решил продемонстрировать результат в виде видео, надеюсь, что все видно

Ну лан, если нужно будет вам какие-то скрины, то по просьбе закину в комментарии

🔺Работа с Базами Данных и Связями

1. Создал полноценную связь между таблицами authors и books. Теперь каждая книга привязана к автору через ForeignKey
(на видео показал как происходит привязка, надеюсь,что видно)

2. Также при удалении автора удаляются и все его книги, не оставляя мусора

3. Немного освоил joinedload. Это позволило базе данных доставать книгу и автора одним эффективным SQL-запросом (JOIN) вместо нескольких медленных.

🔺Архитектура и Рефакторинг

1. Переписал модели полностью, внедрив ко всему декларативные типы Mapped и mapped_column.

2. Использование Annotated
Создал переиспользуемые типы данных (например, pk_id, optional_str) для чистоты кода

3. Модульность (APIRouter)
Разделил проект на части. Создал новую директорию routers для эндпоинтов теперь маршруты книг и авторов находятся там. main.py больше не будет перегружен.

🔺Решение Проблем

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

2. Валидация ответов
Настроил влож схемы Pydantic так, что теперь при запросе книги API возвращает не просто ID, а весь обьект автора

🔺Итоговая структура проекта:
app/
├── main.py
├── database.py
├── models.py
├── schemas.py
├── crud.py
└── routers/
├── authors.py
└── books.py


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

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
653
День - 89

Доброго времени суток!




🖥Обязательные:

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

🔺2. Добавить поиск и фильтрацию
2.1 Поиск по названию

2.2 Фильтрация по цене

2.3 Пагинация
( чтобы API выдавало данные по порциям, не перегружая браузер и сервер )


🔺3. Обработка ошибок
Если что-то идет не так, то сервер выдаст некрасивую ошибку, я сделаю так, чтобы API само вежливо отвечала и указывала на ошибку



Всем продуктивного дня!

#Day89 #Days

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥42👍2🔥111
Итоги дня:

🔺Изучение FastAPI

🔺Вывод всех книг автора
Теперь выводится не только имя автора, но и его книги

🔺Умная фильтрация (Depends)
внедрил профессиональный поиск. Теперь API умеет фильтровать книги по названию и цене, а также поддерживает пагинацию. Это важно для производительности базы данных

🔺Каскадное удаление
Реализовал эндпоинт DELETE /authors/{id} Теперь одним нажатием кнопки можно удалить автора вместе со всеми его книгами

🔺Обработка ошибок
Теперь при запросе несуществующих данных он возвращает 404 Not Found вместо пустоты.

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🔥4
День - 90

Доброго времени суток!

🔺Сейчас грубо говоря финишная прямая идет

По планам вообще:
1. Доделать проект до 95 дня, исправить все ошибки. Добавлю более сильную валидацию, продвинутый поиск, глобальную обработку исключений, поработаю с JWT-аутентификацией

2. До 99 дня изучить основы Docker, пока просто базу

3. 100 День — выкладываю все на GitHub, подвожу итоги

Дальше я планирую немного переименовать свой путь, изучать
ИБ и публиковать лайфстайл.

Также думаю как раз освободится время и по активнее буду вести свой 2 канал @BoCoder_EDU

Про все конечно расскажу подробнее, но со временем




🖥Обязательные:

🔺1. Жёсткая валидация и "Защита от дурака"

Чуть углубляюсь в Pydantic, дорабатываю схемы:
🔺Валидация Авторов

🔺Валидация книг

🔺Безопасность поисковых фильтров


Цель: Доработать то, что я упустил в прошлых днях, усилить валидацию

🔺2. Практический тест

Буду пробовать «ломать» свой API
Проверю как все работает, если что-то не так, то буду чинить;)



Всем желаю продуктивного дня!!

#Day90 #Days

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
5❤‍🔥4👍3🔥1
Итоги дня:

🔺Изучение FastAPI

🔺Жёсткая валидация и "Защита от дурака"

1. Pydantic Field
Теперь каждое поле — это не просто тип (str, int), а набор правил.
Имя автора — Минимум 2 буквы. Цена — Только положительное число
итд..

2. Strict Mode
Включил режим extra='forbid'. Теперь, если кто-то попытается "подсунуть" лишние данные в JSON, сервер выдаст ошибку, а не просто проигнорирует их.

3. DoS-защита
Ограничил пагинацию. Теперь нельзя запросить более 100 книг за раз.

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥522
День - 91

Доброго времени суток!

🔺Постепенно смещаю фокус в сторону Cybersecurity. Сейчас делаю упор на понимание внутренних процессов: как системы работают «под капотом», где ломаются и какие узлы наиболее уязвимы.
Как-то так




🖥Обязательные:

🔺1. Добавление продвинутой сортировки

Задача:
В BookFilters изменить sort_by с обычного str на
Literal["id", "title", "price"].
В crud.py реализовать динамическую сборку

Зачем это нужно:
Как я понял, это нужно для предотвращение Blind SQL Injection в параметрах ORDER BY. Если просто прокидывать строку в запрос, хакер может использовать функции задержки (типа pg_sleep()), чтобы по времени ответа сервера вычислять данные из других таблиц. Literal ограничивает выбор только разрешенными полями.

🔺2. Глобальная обработка исключений

Задача:
Написать функцию с декоратором и понять как она работает: @app.exception_handler(Exception), которая ловит любые непредвиденные ошибки.

Зачем это нужно:
Борьба с Information Exposure (утечкой информации).
По умолчанию Python при ошибке вываливает в ответ "Трейсбэк" - пути к файлам на твоем диске, версии библиотек и куски кода. Это можно использовать как карту для поиска уязвимостей.
А хендлер заменит этот "поток данных" на лаконичное: {"detail": "Internal Server Error"}.

🔺3. Кастомная обработка ошибок базы данных

Задача:
Написать отдельный хендлер для SQLAlchemyError

Зачем это нужно:
Противодействие Fingerprinting (Снятию отпечатков системы).
Это мешает определить тип СУБД

🔺4. Маскировка логов

Задача:
Настроить логирование так, чтобы полная ошибка никогда не уходила в HTTP-ответ клиенту.

Зачем это нужно:
Разработчик должен видеть детали для фикса, а внешний пользователь только статус операции.



Всем продуктивного дня и хорошего настроения!!

#Day91 #Days

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
6❤‍🔥4👍2🔥2🎉111
Итоги дня:

🔺Изучение FastAPI

🔺Добавление продвинутой сортировки

1. Тут я, конечно, потупил. Вроде пункт не самый сложный, но запутался во всем, чем можно. Было много ошибок, особенно когда расширял таблицу в БД: добавлял stock_quantity, и в какой-то момент даже пожалел, что начал, так как посыпались ошибки в синтаксисе.

В итоге всё синхронизировал, код теперь видит новые поля

2. Схемы Pydantic: Обновил BookFilters, добавил в Literal новые поля для сортировки. Теперь Swagger предлагает выбор: id, title, price, pages, stock_quantity.

3. Логика CRUD: Добавил динамическую сборку запроса, которая учитывает выбранное поле и направление (asc/desc).
Работает! ;)

🔺Глобальная обработка исключений
Добавил что-то вроде «защитного слоя», благодаря которому API всегда возвращает понятный JSON, а не падает с непонятным текстом.

1. Создал функцию setup_exception_handlers

2. Теперь при любой непредвиденной ошибке (например, деление на ноль) клиент получает статус 500 с сообщением «Внутренняя ошибка сервера», а детали пишутся только в лог для меня.

🔺Кастомная обработка ошибок базы данных
API стал умнее по отношению к пользователю))

1. Если попробовать привязать книгу к несуществующему автору (author_id), API не просто выдаст ошибку базы, а ответит:
«Связанный объект не найден».

🔺Маскировка логов
Защита конфиденциальных данных, Важный аспект

1. Создал типо кастомного фильтра SensitiveDataFilter, который работает как цензура для логов.

2. Настроил регулярные выражения, которые ищут в сообщениях ключи password, email, token и заменяют их значения на [MASKED].


Итог и мысли:

🔺На самом деле очень интересно узнавать, как всё работает «под капотом». Сейчас сфокусировался на аспектах, близких к ИБ (информационной безопасности). Решил, что не буду расширять проект, просто приведу всё к красивому, правильному виду. Не хочу добавлять новых фишек и тд, пробую только то, что мне реально интересно и пригодится в будущем.

Конечно, выложу всё на GitHub, когда причешу, может кому интересно;0

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

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

Двигаюсь дальше...

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7❤‍🔥3👍3🔥11
День - 92

Дооброго времени суток!

🔺Сегодня буду работать с JWT, намечается что-то интересное




🖥Обязательные:

🔺1. Погружение в теорию JWT
"Что такое JWT и как его создать"
https://youtu.be/7iuwfKOcvkE?si=MF-SI6SFODNMGjrK


Содержание видео:
1. Что такое JWT
2. Из каких частей состоит JWT
3. Как создать JWT
4. Как генерируется подпись в JWT
5. Чем хорош JWT
6. Безопасноcть JWT
7. Советы по применению JWT
8. Что такое refresh token


Это озвучка статей:
1. https://habr.com/ru/articles/340146/
2. https://struchkov.dev/blog/ru/what-is-jwt/


🔺2. Подготовка окружения, настройка библиотек.

🔺3. Создание модели User
Это место, где будут храниться учетные данные.

🔺4. Описание модели в SQLAlchemy
Нужно, чтобы Python узнал о существовании этой таблицы.

🔺5. Работа с инструментами для создания хеша

Например: Когда юзер пришлет qwerty, эта функция превратит его в $2b$12$EixZa.... Именно это и будем сохранять.

🔺6. Схемы Pydantic
Разделяем входные и выходные данные для предотвращения утечек

🔺7. Эндпоинт регистрации
Конец — создание самого маршрута для регистрации

🔺8. JWT-Аутентификация: Выдача токенов
Реализую эндпоинт /login. Именно здесь происходит магия JWT

🔺9. Защита эндпоинтов
Ограничиваю доступ. Сделаю так, что удалять или изменять книги сможет только авторизованный пользователь с валидным токеном.


Вот такой план, вроде как ничего не забыл.
Буду изучать, познавать.
Главная цель — это конечно же понять как это все устроенно и как работает.

Итоги может будут поздно, но постараюсь не тянуть.

Всем хорошего настроение и продуктивного дня!!

#Day92 #Days

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
4❤‍🔥3🔥3👍211
Итоги дня:

🔺Изучение FastAPI

🔺Погружение в теорию JWT

Посмотрел вводное видео, чтобы понимать архитектуру.
Ролик короткий, но максимально по делу.
Очень рекомендую автора, контент у него очень крутой!!

Видео:
"Что такое JWT и как его создать"
https://youtu.be/7iuwfKOcvkE?si=MF-SI6SFODNMGjrK


🔺Подготовка окружения и модель User

1. Установил необходимые библиотеки:
passlib — будет шифровать пароли.

python-jose — будет генерировать и проверять JWT.

python-multipart — обязателен для работы OAuth2 в FastAPI (чтобы принимать логин/пароль из форм).


2. Создание таблицы в БД:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
hashed_password TEXT NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

Создал таблицу users c полем hashed_password.
Хранить пароли в открытом виде нельзя;)

🔺SQLAlchemy и Pydantic:

1. SQLAlchemy: Описал модель User, чтобы ORM знала, как общаться с таблицей в Postgres.

2. Pydantic: Создал схемы для валидации. Теперь на входе API проверяет: корректен ли email, не пустой ли username и достаточно ли надежен пароль.

🔺Эндпоинт регистрации

Собрал всё в кучу: БД + Схемы + Хэширование.
Логику вынес в отдельный роутер app/routers/auth.py.

Сначала посыпались ошибки: конфликт версий bcrypt и права доступа к последовательностям в Postgres (InsufficientPrivilegeError).
Но всё пофиксил: 200 OK, пользователь в базе, пароль зашифрован

🔺Security Layer
Вынес логику безопасности в security.py
Реализовал проверку пароля и генерацию токенов. Тут же победил «баг» с ограничением bcrypt в 72 байта и подружил старый passlib с новым Python 3.12.

🔺Авторизация и выдача JWT

1. Написал create_access_token - «генератор пропусков».

2. Запустил эндпоинт POST /auth/login.
На выходе получил валидный токен.
Проверил через jwt.io — внутри всё хорошо: мой email и время жизни токена (exp).
Работает;)

🔺Последний штрих: (Защищенный маршрут /me)
Провека, как API будет узнавать пользователя по токену.

1. Добавил логику декодирования токена.

2. Создал эндпоинт, который отдает данные текущего юзера.

Залогинился, проверил, работает
Без токена система внутрь не пускает.

ИТОГ:

🔺Интересная тема, узнал для себя что-то новое, а главное, что полезное. Это пригодится еще в ИБ

🔺Скринов много не влезет, так что если интересно что-то конкретное по коду - пишите в комментарии, скину.

🔺План на ближайшее время: причесать код, зиучить основы Docker и залить всё на GitHub.
До 100-го дня успею


Был бы рад получить какой-то фидбек в комментариях.
Может быть я не до конца рассказываю что-то или чего-то не хватает? Что можно было бы добавить в итоги дня и тд
Буду рад, если дадите обратную связь, спасибо!!


➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥833👍11
День - 93

Доброго времени суток!

🔺По тихоньку буду перебираться к изучению основ Docker

Сегодня буду все причесывать в проекте для красоты и начинать погружение




🖥Обязательные:

🔺1. Проверка
Просмотрю все файлы, уберю лишнюю информацию и мусор. Немного подкорректирую, что нужно и все будет четенько

🔺2. Проверка Безопасности
На всякий случай проверю все файлы, на то, не прописал ли я случайно секретных паролей и тд

Также пройдусь по основным моментам по безопасности в коде для проверки, может найду что;)

🔺3. Подготовка к работе с Docker
Docker — это популярная открытая платформа для контейнеризации, позволяющая упаковать приложение со всем его окружением (библиотеками, зависимостями, настройками) в изолированный контейнер.
Думаю, что начну с вводных видео, но не подобрал еще каких именно.
Их довольно много, вечером в итогах поделюсь теми, которые оказались действительно хороши

Подготовлю все, настрою все необходимое

Еще создам первый Dockerfile


А так моя цель:
Освоить основы и иметь понимание как и что работает.

Вот в проекте я считай все попробовал, потрогал, потыкал, поэкспериментировал и понял основную работу API "под капотом"

Все это мне пригодится в ИБ, Docker тоже очень полезный инструмент, так что вродь как все не зря;)



Вот как-то так пока получается. Даже по раньше заканчиваю работу с API, чем планировал

А вам желаю хорошего дня и прекрасного настроения!

#Day93 #Days

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥44❤‍🔥32👍11
Итоги дня:

🔺Изучение FastAPI

Заканчиваю свой путь в FastAPI.
Провел небольшой рефакторинг: удалил неиспользуемые импорты и лишние print(), которые засоряли логи.
Теперь всё чисто.

🔺Погружение в Docker 👩‍💻

1. Начал с теории на YouTube.
Понял, что полноценные плейлисты смотреть пока рано, подумал, что пока нужен быстрый старт для пет-проекта.
Конечно со временем буду погружаться в изучение Docker.

В итоге не нашел ничего полезного (наверное плохо искал) и просто общался с Gemini, задавал ей вопросы, разбирали основы, архитектуру и конкретные шаги внедрения.

2.Как только освоил базу, внедрил в проект всё необходимое:
.dockerignore, docker-compose.yml, Dockerfile и requirements.txt.

3. Написал свой первый Dockerfile и docker-compose.yml для связи API с PostgreSQL.
Теперь проект - это изолированная система, которую можно запустить одной командой на любом сервере.

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

5. Безопасность:
Вынес все чувствительные данные (пароли, ключи) в .env, а сам файл скрыл через .gitignore

6. Победил ошибку Port already in use:
Выяснил, что локальный Postgres конфликтовал с контейнером на порту 5432. Решил через:
sudo systemctl stop postgresql.

7. Поймал классический баг
Приложение запускалось быстрее, чем база успевала настроиться. Разобрался, пофиксил.

ИТОГ:

🔺Проект вроде как полностью упакован в Docker, завтра буду все проверять еще разок, еще поищу видео по Docker для базы и мб уже все выложу на GitHub

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
3❤‍🔥3👍3🔥1