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

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


Админ/Связь: @BoCoder_Work
Download Telegram
Итоги дня:

🔺Изучение FastAPI

🔺Валидация через Pydantic (schemas.py)
Реализовал схемы для книг.
Теперь данные проверяются до попадания в базу. Если цена книги будет отрицательной или название пустым, API само выдаст ошибку, защищая базу от мусора.

Пока реализовал только с Books тк с Users логика вроде как по сложнее и решил отложить на дальнейшее развитие и написание проекта.

(1 фото)

🔺Настроил «Умный кран» (get_db)
В файле database.py появилась функция-генератор get_db
Теперь сессии к базе данных теперь открываются ровно на время запроса и автоматически закрываются после него. Это дает гарантию ,что PostgreSQL не «упадет» от большого количества открытых соединений.

(2 фото)

🔺По совету из чата создал crud.py
Всю логика работы с SQLAlchemy вынес в отдельное место.
Теперь main.py не перегружен лишним кодом, и вносить правки будет гораздо легче

Также по совету много где внедрил Annotated для чистого кода, спасибо

(3 фото crud)

🔺Оживил API (Эндпоинты)

В app/main.py заработали маршруты:
1. POST /books/ — сохраняет книгу в базу и возвращает её с присвоенным ID
2. GET /books/ — выводит список всех книг из базы.

(4 фото main | 5 фото вывод книг | 6 фото таблички)

🔺Всё работает;)
В начале дня думал, что будет много ошибок и ничего не заработает, но оказалось наооборот. Все хорошо вообще, работает, я рад

Итоги дня в тик ток:
https://vt.tiktok.com/ZSmjCDw4y/

Поддержите🤪

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥52👍1🔥1
💗 День - 88 💗

Доброе утро!
Поздравляю с 14 февраля;)

🔺Вообще сегодня думал отдохнуть, но некоторые планы отменились и освободилось время.
Так что продолжаю работу и изучение🐰




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

🔺1. Создание связи «Книга — Автор»

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

🔺2. Реализация Get Single Item (GET /books/{id})

Научу API находить одну
конкретную книгу по её ID
:
Если книга есть - показать
Если книги нет - 404 Not Found


(работа с HTTPException)

🔺3. Удаление и обновление (DELETE и PATCH)

Допишу оставшиеся функции в crud.py:
Delete: чтобы можно было удалять ошибочно созданные книги.
Patch: чтобы можно было менять цену или количество книг на складе

🔺4. Вынос эндпоинтов в routers.py

До конца отчищаю main.py, переношу логику книг в routers/books.py



Желаю всем продуктивно провести субботу!!❤️

#Day88 #Days

➡️ BoCoder | 💬 Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
10❤‍🔥5🔥4
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