Итоги дня:
🔺 Изучение 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 заработали маршруты:
(4 фото main | 5 фото вывод книг | 6 фото таблички)
🔺 Всё работает;)
В начале дня думал, что будет много ошибок и ничего не заработает, но оказалось наооборот. Все хорошо вообще, работает, я рад
Итоги дня в тик ток:
https://vt.tiktok.com/ZSmjCDw4y/
Поддержите🤪
➡️ BoCoder | 💬 Chat
Реализовал схемы для книг.
Теперь данные проверяются до попадания в базу. Если цена книги будет отрицательной или название пустым, API само выдаст ошибку, защищая базу от мусора.
Пока реализовал только с Books тк с Users логика вроде как по сложнее и решил отложить на дальнейшее развитие и написание проекта.
(1 фото)
В файле database.py появилась функция-генератор get_db
Теперь сессии к базе данных теперь открываются ровно на время запроса и автоматически закрываются после него. Это дает гарантию ,что PostgreSQL не «упадет» от большого количества открытых соединений.
(2 фото)
Всю логика работы с SQLAlchemy вынес в отдельное место.
Теперь main.py не перегружен лишним кодом, и вносить правки будет гораздо легче
Также по совету много где внедрил Annotated для чистого кода, спасибо
(3 фото crud)
В app/main.py заработали маршруты:
1. POST /books/ — сохраняет книгу в базу и возвращает её с присвоенным ID
2. GET /books/ — выводит список всех книг из базы.
(4 фото main | 5 фото вывод книг | 6 фото таблички)
В начале дня думал, что будет много ошибок и ничего не заработает, но оказалось наооборот. Все хорошо вообще, работает, я рад
Итоги дня в тик ток:
https://vt.tiktok.com/ZSmjCDw4y/
Поддержите
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥5❤2👍1🔥1
Поздравляю с 14 февраля;)
Так что продолжаю работу и изучение
🖥 Обязательные:
Сейчас автор — это просто строка, я решил создать модель Author (имя, биография) и связать книгу с автором через author_id.
Это позволит связывать сотни книг с одним автором
Научу API находить одну
конкретную книгу по её ID:
Если книга есть - показать
Если книги нет - 404 Not Found
(работа с HTTPException)
Допишу оставшиеся функции в crud.py:
Delete: чтобы можно было удалять ошибочно созданные книги.
Patch: чтобы можно было менять цену или количество книг на складе
До конца отчищаю main.py, переношу логику книг в routers/books.py
Желаю всем продуктивно провести субботу!!
#Day88 #Days
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, а весь обьект автора
🔺 Итоговая структура проекта:
На видео старался продемонстрировать весь код и его работу, пишите в комментариях, если видео не очень и лучше кидать скрины.
➡️ BoCoder | 💬 Chat
Решил продемонстрировать результат в виде видео, надеюсь, что все видно
Ну лан, если нужно будет вам какие-то скрины, то по просьбе закину в комментарии
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
На видео старался продемонстрировать весь код и его работу, пишите в комментариях, если видео не очень и лучше кидать скрины.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6 5 3
🖥 Обязательные:
Нужно добавить это, чтобы видеть не только имя писателя, но и весь список произведений
2.1 Поиск по названию
2.2 Фильтрация по цене
2.3 Пагинация
( чтобы API выдавало данные по порциям, не перегружая браузер и сервер )
Если что-то идет не так, то сервер выдаст некрасивую ошибку, я сделаю так, чтобы API само вежливо отвечала и указывала на ошибку
Всем продуктивного дня!
#Day89 #Days
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥4❤2👍2🔥1 1 1
Итоги дня:
🔺 Изучение FastAPI
🔺 Вывод всех книг автора
Теперь выводится не только имя автора, но и его книги
🔺 Умная фильтрация (Depends)
внедрил профессиональный поиск. Теперь API умеет фильтровать книги по названию и цене, а также поддерживает пагинацию. Это важно для производительности базы данных
🔺 Каскадное удаление
Реализовал эндпоинт DELETE /authors/{id} Теперь одним нажатием кнопки можно удалить автора вместе со всеми его книгами
🔺 Обработка ошибок
Теперь при запросе несуществующих данных он возвращает 404 Not Found вместо пустоты.
➡️ BoCoder | 💬 Chat
Теперь выводится не только имя автора, но и его книги
внедрил профессиональный поиск. Теперь API умеет фильтровать книги по названию и цене, а также поддерживает пагинацию. Это важно для производительности базы данных
Реализовал эндпоинт DELETE /authors/{id} Теперь одним нажатием кнопки можно удалить автора вместе со всеми его книгами
Теперь при запросе несуществующих данных он возвращает 404 Not Found вместо пустоты.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥4
По планам вообще:
1. Доделать проект до 95 дня, исправить все ошибки. Добавлю более сильную валидацию, продвинутый поиск, глобальную обработку исключений, поработаю с JWT-аутентификацией
2. До 99 дня изучить основы Docker, пока просто базу
3. 100 День — выкладываю все на GitHub, подвожу итоги
Дальше я планирую немного переименовать свой путь, изучать
ИБ и публиковать лайфстайл.
Также думаю как раз освободится время и по активнее буду вести свой 2 канал @BoCoder_EDU
Про все конечно расскажу подробнее, но со временем
🖥 Обязательные:
Чуть углубляюсь в Pydantic, дорабатываю схемы:
🔺 Валидация Авторов🔺 Валидация книг🔺 Безопасность поисковых фильтров
Цель: Доработать то, что я упустил в прошлых днях, усилить валидацию
Буду пробовать «ломать» свой API
Проверю как все работает, если что-то не так, то буду чинить;)
Всем желаю продуктивного дня!!
#Day90 #Days
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
1. Pydantic Field
Теперь каждое поле — это не просто тип (str, int), а набор правил.
Имя автора — Минимум 2 буквы. Цена — Только положительное число
итд..
2. Strict Mode
Включил режим extra='forbid'. Теперь, если кто-то попытается "подсунуть" лишние данные в JSON, сервер выдаст ошибку, а не просто проигнорирует их.
3. DoS-защита
Ограничил пагинацию. Теперь нельзя запросить более 100 книг за раз.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤2 2
Как-то так
🖥 Обязательные:
Задача:
В BookFilters изменить sort_by с обычного str на
Literal["id", "title", "price"].
В crud.py реализовать динамическую сборку
Зачем это нужно:
Как я понял, это нужно для предотвращение Blind SQL Injection в параметрах ORDER BY. Если просто прокидывать строку в запрос, хакер может использовать функции задержки (типа pg_sleep()), чтобы по времени ответа сервера вычислять данные из других таблиц. Literal ограничивает выбор только разрешенными полями.
Задача:
Написать функцию с декоратором и понять как она работает: @app.exception_handler(Exception), которая ловит любые непредвиденные ошибки.
Зачем это нужно:
Борьба с Information Exposure (утечкой информации).
По умолчанию Python при ошибке вываливает в ответ "Трейсбэк" - пути к файлам на твоем диске, версии библиотек и куски кода. Это можно использовать как карту для поиска уязвимостей.
А хендлер заменит этот "поток данных" на лаконичное: {"detail": "Internal Server Error"}.
Задача:
Написать отдельный хендлер для SQLAlchemyError
Зачем это нужно:
Противодействие Fingerprinting (Снятию отпечатков системы).
Это мешает определить тип СУБД
Задача:
Настроить логирование так, чтобы полная ошибка никогда не уходила в HTTP-ответ клиенту.
Зачем это нужно:
Разработчик должен видеть детали для фикса, а внешний пользователь только статус операции.
Всем продуктивного дня и хорошего настроения!!
#Day91 #Days
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6❤🔥4👍2🔥2🎉1 1 1
Итоги дня:
🔺 Изучение 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
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
По проекту: всё протестировал, всё работает. Ошибок было море, долго разбирался (в основном из-за невнимательности), но это вродь отличный опыт.
Двигаюсь дальше...
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7❤🔥3👍3🔥1 1
🖥 Обязательные:
"Что такое 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/
Это место, где будут храниться учетные данные.
Нужно, чтобы Python узнал о существовании этой таблицы.
Например: Когда юзер пришлет qwerty, эта функция превратит его в $2b$12$EixZa.... Именно это и будем сохранять.
Разделяем входные и выходные данные для предотвращения утечек
Конец — создание самого маршрута для регистрации
Реализую эндпоинт /login. Именно здесь происходит магия JWT
Ограничиваю доступ. Сделаю так, что удалять или изменять книги сможет только авторизованный пользователь с валидным токеном.
Вот такой план, вроде как ничего не забыл.
Буду изучать, познавать.
Главная цель — это конечно же понять как это все устроенно и как работает.
Итоги может будут поздно, но постараюсь не тянуть.
Всем хорошего настроение и продуктивного дня!!
#Day92 #Days
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4❤🔥3🔥3👍2 1 1