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

51 lines
4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Как устроен 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` запуск невозможен.