1
0
Fork 0
mirror of https://github.com/EDeev/deev.space.git synced 2026-10-07 20:49:59 +03:00
deev.space/docs/architecture.md
Egor Deev a696d996b9 README на русском и английском, документация, скриншоты, лицензия MIT
- README.md и README.en.md: что это, статус, скриншоты, быстрый старт в Docker,
  установка без Docker, переменные окружения, схема, развёртывание, разработка;
- docs/architecture.md (модели, оценки без регистрации, антинакрутка, безопасность)
  и docs/deploy.md (Docker и устройство боевого сервера) вместо описания моделей в README;
- файл LICENSE (MIT), который раньше был заявлен только в README.
2026-10-02 12:23:09 +00:00

4 KiB
Raw Blame History

Как устроен deev.space

Django-проект dspace с одним приложением main. База — SQLite, статика — whitenoise (в бою — nginx), шаблоны — Django templates, без фронтенд-фреймворков.

dspace/            настройки, корневые URL, WSGI
main/
  models.py        модели контента, оценок и настроек сайта
  views.py         страницы (классовые представления) и JSON-API оценок и комментариев
  forms.py         формы с очисткой HTML (bleach) и Yandex SmartCaptcha
  middleware.py    анонимный ID посетителя, хэш IP, фильтр ботов
  signals.py       действия после публикации статьи (автопостинг, ping Яндекса)
  admin.py         админка с превью и инлайнами медиа статьи
  management/      load_initial_data, populate_demo
templates/         шаблоны страниц, включая includes/ и errors/
static/            CSS по слоям (variables, base, components, layout, pages, media), JS

Модели

Модель Назначение
SiteSettings синглтон с текстами сайта, контактами, карточкой-паспортом (SiteSettings.load())
CustomUser пользователь для комментариев, упрощённая регистрация
Category, Article статьи блога и достижения (is_achievement); slug генерируется из заголовка
ArticleImage, ArticleFile, ArticleLink галерея, вложения и ссылки статьи; у ссылок — автоматическое превью по Open Graph
Project, ProjectStatus проекты портфолио с гибкими статусами
Skill, Experience, Education стек по категориям, опыт и образование
Comment комментарии с ответами до трёх уровней вложенности
ArticleLike, CommentLike лайки и дизлайки — от пользователя или анонимного посетителя
ArticleView уникальный просмотр статьи (один на посетителя)
ContactMessage сообщения с формы обратной связи

Оценки без регистрации

  1. VisitorMiddleware выдаёт каждому посетителю подписанную cookie dspace_vid (uuid4, httponly, год).
  2. Голос привязан к аккаунту, если пользователь вошёл, иначе — к visitor_id. Повторный клик снимает голос, клик по противоположной кнопке меняет его.
  3. Антинакрутка: с одного хэша «IP + User-Agent» (соль — SECRET_KEY) — не больше двух новых анонимных оценок одного объекта в сутки. Для loopback и частных адресов хэш не считается, лимит не применяется.
  4. Уникальные просмотры (ArticleView) пишутся только для посетителей, которых is_bot() не считает роботами.

Безопасность

  • HTML комментариев проходит через bleach (белый список тегов), из формы обратной связи вырезается весь.
  • Форма обратной связи защищена Yandex SmartCaptcha.
  • Превью ссылок загружаются только с публичных http(s)-адресов.
  • С DJANGO_DEBUG=False: HSTS, редирект на HTTPS, secure-cookie; без DJANGO_SECRET_KEY запуск невозможен.