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