Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Сказочник: AI писатель и художник детских сказок

Python: 3.12 Fullstack: FastAPI ORM: SQLAlchemy DB: PostgreSQL AI: Mistral Suitable for: NoScript

Особенности:

  • Сайт корректно работает с включённым NoScript (личное требование, т.к. раздражают "тяжелые" сайты, следовательно React и подобные Frontend решения не подходят)
  • Единый подход к работе с сессиями и пользователями (HTML+API), которые хранятся в защищенных cookie (из коробки ни в FastAPI, ни в OpenAPI (Swagger UI) такого решения для API - нет)
  • При шифровании паролей используется настраиваемый Scrypt (предлагаемый по умолчанию Bcrypt уже не лучшее решение)

Планы:

Backend:

  • Разобраться с Middleware (session, user) и адаптировать свою реализацию (штатные выглядели крайне подозрительно, например JWT в starlette SessionMiddleware: кратко, детальнее)
  • Все "html action routes" работают через редирект на "html page routes", соответственно _route_handler() вызывается дважды, но с другой стороны так достигается единый подход в обработке "page" и "action", следовательно сессия создается во всех случаях, кроме logout_user() (возможно стоит запретить использовать actions без сессии т.к. они создаются со страницы и возвращаются на неё-же через referrer, смысла в прямом вызове не вижу - тогда двойной вызов будет устранен)
  • Добавить отложенную запись в БД (если нужно):
    • Запись - переместить обновление SessionDB.updated_at в "Session cache cleaner", и так-же обновлять при закрытии приложения (Session.init)
    • Чтение (если действительно ускорит) - кэшировать запросы сказок и их количество, обновлять при добавлении (других операций пока не предвидится, если будет добавлена модификация - можно на месте при модификации кэш обновлять)
  • Вывести текстовые строки в отдельный файл, например в app/__init__.py (from app import text, для разделения сообщений HTML/API, подгрузки фактических вариантов ответа в документацию, устранения дублирования и в целом удобства сопровождения)
  • Добавить описания ошибок в API после создания общего места для текстовых строк
  • Унифицировать добавление асинхронных задач в общий пул
  • Изучить Keycloak (выглядит многообещающе, особенно для нескольких сервисов с единой базой пользователей, но нужно переделывать для работы с включённым NoScript)
  • Использование векторной БД для поиска похожих сказок

Frontend:

  • Работа без перезагрузки страниц в JS режиме (т.к. штатно в HTML+CSS таких опций не существует - нравится подход HTMX, хорошо сочетается с Jinja Templates)
  • Уведомления в JS режиме (работают только при перезагрузке страницы т.к. подгружаются из cookie, например уведомление переключения темы отображается только с включённым NoScript)
  • Найти правильный способ отображать html после применения внешнего CSS (с оверлеями проблем нет т.к. прозрачность устанавливается в html head, а вот с кнопками и полями сложнее т.к. требуется доступ к константам во внешнем файле) %% Исправлено в v0.2 %%
  • Останавливать таймер удаления уведомления, когда курсор на него наведен

Fullstack:

  • Постоянное уведомление о том, что сайт лучше работает с включенным JS, с возможностью скрытия (после скрытия сохраняется в cookie, и, например, в базу, если пользователь вошёл)
  • Добавить обратную связь о работе нейросети ("зависание" страницы от 30 секунд до 10 минут - далеко не лучшее решение)
  • Добавить нажатия на уведомления о готовности сказки (с переходом к ней, после добавления общей очереди)
  • Добавить редактирование профиля пользователя
  • Добавить аватарки
  • Добавить поиск по тегам и заголовкам на главной странице, переход на главную по нажатию на тег в странице сказки
  • Добавить группировку персонажей из одного произведения в тегах
  • Добавить оценки сказкам
  • Добавить рекомендации сказок для зарегистрированных пользователей
  • Добавить простые задания, решение которых даёт возможность создавать дополнительные сказки израсходовав суточный лимит

Известные проблемы:

Backend:

  • Нет общей очереди для работы с нейросетью (на данный момент параллельное использование, что чревато перегрузками)

Frontend:

  • Не нашел способ сохранять выбранную тему без JS, не нарушая внешнего вида анимаций переключателя темы (с включенным JS всё работает, переносить переключатель темы в отдельную форму с кнопкой сохранения проблему-бы устранило, но во первых портит запланированную логику (переключатель в углу доступный всегда), во вторых это зарезервировано для изменения темы по умолчанию - при редактировании профиля пользователя, которое пока не реализовано):
    • <input type="image"> вместо <input type="submit"> выглядит крайне ужасной идеей
    • <input type="submit"> вместо <input type="checkbox"> похоже не может сработать в принципе, т.к. у кнопки одно постоянное состояние, а событийное :active переделать в постоянное не нашел способа
    • <input type="submit" style="opacity: 0"> над <input type="checkbox"> не работает т.к. перехватывает нажатия не пропуская их ниже, следовательно все анимации переключения не работают, и нужно перезагружать страницу с новой темой (текущий вариант), или переключать с анимацией, но без сохранения текущей выбранной темы, что было-бы странным
    • Не уверен, подходит-ли вариант через :target к данному случаю
  • Не все анимации отображаются корректно (в некоторых местах лишние (footer), в некоторых не хватает) %% Исправлено в v0.2 %%
  • Если обновить страницу OpenAPI (Swagger UI) с успешной авторизацией - визуально авторизация теряется, но по факту всё работает т.к. не было Logout.
  • Первое нажатие на Зарегистрироваться создает запрос, а не должно, последующие не создают (добавление ? перед # в URL)
  • Найти способ подгрузки внешней таблицы стилей до отображения получше (браузер применяет файл 2 раза, это видно в отладчике и определенно неправильно) %% Исправлено в v0.2 %%
  • Toggle моргает при обновлении страницы (подгрузка внешней таблицы стилей устранена, но негативный эффект остался)
  • notify_progress когда есть 2 уведомления - на втором скрыт (при обновлении страницы, пока курсор не попадет на страницу)
  • При нажатии кнопки назад в браузере - отображаются старые уведомления из cookie

Минимальное содержимое .env файла

DB_KW={'url': 'postgresql+asyncpg://user:password@hostname/db_name'}
ADMIN_KW={'username': 'admin_name', 'password': 'admin_password', 'man': True, 'age': 20, 'dark_theme': True}
FASTAPI_KW={}
NEURALNET_KW={'api_key': 'mistral_api_key'}
PASSWORD_HASHER_KW={}

About

Сказочник: AI писатель и художник детских сказок (Fullstack FastAPI)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages