• эндпойнты — FastAPI;
• HTML-шаблоны — Jinja2;
• база данных — PostgreSQL;
• взаимодействие с базой (асинхронное) — SQLAlchemy;
• миграции — Alembic;
• модели данных — Pydantic;
• аутентификация — базовая, через куки и bcrypt.
Проект представляет собой блог с веб-интерфейсом, в котором пользователи могут просматривать публикации, а зарегистрировавшись, создавать их сами.
Основная страница блога располагается по адресу /api/blog, ссылка на неё расположена на любой другой странице сайта. В шапке страницы расположены ссылки на вход и регистрацию, если пользователь не выполнил вход, иначе — ссылки на страницу пользователя (GET /api/users/{user_id}), создание новой публикации (GET /api/blog/create) и выход (GET /api/logout). Под шапкой расположена ссылка на список пользователей блога. В теле страницы расположены записи блога, отсортированные по дате публикации (чем новее, тем выше), каждая публикация выделена в отдельный блок: название (со ссылкой на саму запись), часть текста записи, автор (со ссылкой на страницу автора) и дата публикации.
На список пользователей /api/users можно перейти с основной страницы. Он представляет собой таблицу с полями: никнейм, роль, дата регистрации, количество опубликованных постов и дата последней публикации. Пользователи сортируются по убыванию количества записей, даты последней публикации и даты регистрации.
На страницу пользователя /api/users/{user_id} можно перейти со списка пользователей, с основной страницы, со страницы публикации, из шапки основной страницы, если пользователь выполнил вход. В шапке страницы указаны никнейм пользователя и дата его регистрации, а если пользователь вошёл на сайт и находится на своей странице — кнопка «Опубликовать новый пост…». Ниже расположена таблица с публикациями, отсортированными по убыванию даты публикации и полями: название публикации, её дата и превью.
На страницу публикации /api/blog/{blog_id} можно перейти с основной страницы, со страницы пользователя, автоматически после публикации записи. Страница содержит название публикации, ссылку на её автора, дату публикации и полный текст записи.
На страницу создания новой записи в блоге /api/blog/create можно перейти с основной страницы или со своей страницы пользователя, если пользователь вошёл в систему. Пользователю предлагается ввести заголовок поста и его текст, после чего он может опубликовать запись, нажав на кнопку «Опубликовать», в результате чего будет послан POST-запрос /api/blog/create, будет создана новая запись с введёнными данными и произойдёт перенаправление на страницу этой записи.
На страницу регистрации /api/signup можно попасть с основной страницы, если пользователь не выполнил вход или разлогинился. Пользователю предлагается придумать свои логин и пароль и подтвердить свой выбор нажатием на кнопку «Зарегистрироваться», в результате чего будет послан POST-запрос /api/signup. В случае, если логин уже занят, произойдёт ошибка 400 "Username already exists". В противном случае данные о новом пользователе будут внесены в базу данных, а сам пользователь — переведён на страницу входа.
На страницу входа /api/login можно попасть с основной страницы или автоматически после регистрации. Пользователю предлагается ввести свои логин и пароль и залогиниться нажатием на кнопку «Войти», в результате чего будет послан POST-запрос /api/login. В случае, если такого пользователя не существует или был введён неверный пароль, произойдёт ошибка 400 "Invalid username or password". В противном случае данные о сессии будут записаны, и пользователь будет перенаправлен на основную страницу с возможностью создавать новые посты.
Если пользователь осуществил вход, он может совершить выход, нажав на соответствующую ссылку в шапке основной страницы. В этом случае данные о сессии пользователя удаляются, и он теряет возможность публиковать новые посты.