Как я строил этот блог вместе с ИИ

blogtest · 19.08.2026 07:53 #markdown #django #AI #blog
Как я строил этот блог вместе с ИИ

Как я строил этот блог вместе с ИИ

Этот блог — эксперимент. Он написан на Django 6, рендерится Markdown, работает в двух темах и частично создан искусственным интеллектом. Здесь расскажу, как и зачем всё устроено, и попутно покажу всё, на что способен наш Markdown-движок.

Рабочее пространство


Зачем

Старый блог на Django 2.2.4 проработал несколько лет. Работал — но пришла пора обновиться: новая версия Django, нормальная типографика, поддержка тёмной темы, многопользовательский авторство. Вместо того чтобы мигрировать по старой схеме, я решил построить блог с нуля — и сразу заложить всё, что хотелось видеть.

Цели

  • Markdown вместо WYSIWYG-редактора
  • Тёмная и светлая темы
  • Несколько авторов с ролями
  • Код с подсветкой и копированием
  • Мерmaid-диаграммы, формулы, таблицы

Ограничения

  • Всё в одном Django-проекте
  • SQLite локально, PostgreSQL на проде
  • Минимум зависимостей
  • Деплой через git push

Стек технологий

Компонент Технология Зачем
Бэкенд Django 6, Python 3.14 Фреймворк, модели, views
БД (локал) SQLite Простота, zero-config
БД (прод) PostgreSQL 16 Надёжность, производительность
Рендеринг Python-Markdown + pymdown-extensions Весь Markdown-пайплайн
Подсветка кода Pygments 100+ языков
Математика MathJax (arithmatex) LaTeX-формулы
Диаграммы Mermaid Графы, процессы, sequence
Обёртка nginx + uWSGI Проксирование, статика
SSL Let's Encrypt HTTPS
Деплой GitLab webhook → systemd Автоматический

Как устроен рендеринг

Каждая статья хранится в Markdown. При сохранении в БД (pre_save сигнал) Markdown конвертируется в HTML и кэшируется в полях content_html и brief_html. Шаблон просто выводит {{ article.content_html|safe }} — без рендеринга на лету.

graph LR
A[Markdown
в БД] -->|pre_save| B[render] B --> C[HTML
кэш в БД] C -->|шаблон| D[Отданный
HTML]

Это значит, что при изменении пайплайна рендеринга нужно пересобрать все статьи командой rerender_articles.


Форматирование текста

Вот всё, что умеет наш движок. Жирный текст, зачёркнутый, выделенный, H2O — водород, x2 — степень, а ещё ++клавиши++: нажмите Ctrl+S чтобы сохранить.

Цитаты

Программирование — это не про компьютеры. Программирование — это про мышление. — Jeff Atwood

Списки задач

  • Выбрать фреймворк
  • Настроить Markdown-пайплайн
  • Реализовать тёмную тему
  • Завоевать мир
  • Написать больше статей

Определения

Markdown
Язык разметки для создания структурированного текста с помощью простого синтаксиса.
Django
Высокоуровневый Python-фреймворк, следующий принципам «батареи включены».
attr_list
Расширение для Python-Markdown, позволяющее добавлять CSS-классы и атрибуты прямо из текста.

Буквенные списки

  1. Написать код
  2. Задеплоить
  3. Написать статью о том, как задеплоил
  1. Первый пункт
  2. Второй пункт
  3. Третий

Умные символы

© 2026 bl0g.ru, ®, → стрелка вправо, ← стрелка влево, --- тире, ½ и ¾ дроби.


Код

Подсветка работает для более чем 100 языков. Блоки кода копируются одной кнопкой.

Python

from dataclasses import dataclass
from typing import Optional

@dataclass
class Article:
    title: str
    slug: str
    content: str
    author: str
    status: str = "draft"
    cover: Optional[str] = None

    def publish(self) -> None:
        self.status = "published"
        print(f"Опубликовано: {self.title}")

Bash

# Деплой на прод
cd /srv/bl0g
source venv/bin/activate
python manage.py migrate
python manage.py collectstatic --noinput
systemctl restart bl0g

Inline-код

Используйте псевдо-тег class Meta для подсветки отдельных фрагментов.


Таблицы

Расширение Синтаксис Результат
Табы === "Заголовок" Переключаемые вкладки
Details ??? "Текст" Сворачиваемый блок
Admonition !!! note "Заголовок" Цветной блок-уведомление
Task lists - [x] Задача Список с чекбоксами
Mermaid ```mermaid Диаграммы и графы
MathJax $formula$ LaTeX-формулы

Блоки уведомлений (Admonition)

Примечание

Эта статья — не инструкция, а рассказ. Если что-то непонятно, загляните в документацию.

Совет

Используйте admonition чтобы выделить важные блоки в тексте. Они работают в обеих темах.

Внимание

При ручном деплое медиафайлов через scp не забывайте исправлять права: chown www-data:www-data.

Опасно

Никогда не публикуйте ключи, пароли и токены в статьях. Контент блога публичный.


Сворачивающиеся блоки (Details)

Что внутри движка Markdown?

Python-Markdown с расширениями: meta, extra, admonition, codehilite, attr_list, def_list, arithmatex, tabbed, superfences, magiclink, highlight, tasklist, details, emoji, keys, mark, caret, tilde, critic, inlinehilite, fancylists, smartsymbols, toc.

Сколько статей опубликовано?

На момент написания — более 30 статей. Большинство из них — о Python, Django и веб-разработки.


Вкладки (Tabbed)

Про вкладки

Вкладки не печатаются в выводе — при нажатии «Печать» все вкладки показываются последовательно с заголовками.

def fibonacci(n: int) -> list[int]:
    a, b = 0, 1
    result = []
    for _ in range(n):
        result.append(a)
        a, b = b, a + b
    return result
function fibonacci(n) {
    const result = [];
    let a = 0, b = 1;
    for (let i = 0; i < n; i++) {
        result.push(a);
        [a, b] = [b, a + b];
    }
    return result;
}
# Числа Фибоначчи через awk
awk 'BEGIN { a=0; b=1; for(i=0;i<10;i++){print a; t=a+b; a=b; b=t} }'

Математика (MathJax)

Инлайн-формула: E = mc^2 — известная формула Эйнштейна.

Блочная формула — интеграл:

\int_{a}^{b} x^2 \, dx = \frac{b^3 - a^3}{3}

Матрица:

A = \begin{pmatrix} a & b \\ c & d \end{pmatrix}

Сумма:

\sum_{i=1}^{n} i = \frac{n(n+1)}{2}

Диаграммы (Mermaid)

Граф процессов

graph TD
Start[Начало] --> Write[Написать статью]
Write --> Review{Ревью}
Review -->|ОК| Deploy[Деплой]
Review -->|Правки| Write
Deploy --> Done[Опубликовано]
Done -->|Feedback| Review

Последовательность

sequenceDiagram
participant U as Автор
participant B as Блог
participant S as Сервер

U->>B: Пишет Markdown
B->>B: pre_save → HTML
U->>B: Нажимает «Опубликовать»
B->>S: webhook (git push)
S->>S: git pull → migrate
S->>S: collectstatic → restart
S-->>U: Статья жива!

Колонки и карточки

Колонки (без рамки)

Плюсы колонок

  • Адаптивная сетка
  • Работают в обеих темах
  • На мобильных — одна колонка

Минусы

  • Нужно помнить про ::: разделитель
  • Вложенность ограничена
  • Не печатаются в две колонки

Карточки (с фоном)

Быстрый старт

  • Установите Django
  • Создайте проект
  • Напишите первую статью

Продвинутый уровень

  • Кастомные fence-блоки
  • CSS-утилиты через attr_list
  • Mermaid и MathJax

Масштабирование

  • PostgreSQL вместо SQLite
  • nginx + uWSGI
  • Автодеплой через webhook

CSS-классы через attr_list

Наш блог поддерживает утилитарные CSS-классы — что-то вроде мини-Tailwind для Markdown. Подробности в отдельной статье, а здесь — примеры.

Дашборд с компонентами

Цвета и фоны

Крупный вводный текст для привлечения внимания.

Мелкий приглушённый текст — подпись или примечание.

Акцентный блок — важное сообщение на синем фоне.

Операция выполнена успешно.

Ошибка при загрузке файла.

Предупреждение — обратите внимание.

Границы и тени

Карточка с рамкой и скруглёнными углами.

Блок-цитата с акцентной полоской слева.

Карточка с тенью — выглядит объёмнее.

Выравнивание

Этот текст выровнен по центру.

А этот — по правому краю.

Этот текст выровнен по ширине. Он занимает всю доступную ширину, а слова распределяются равномерно между левым и правым краем. Хорошо работает для длинных абзацев с переносами строк.

Кнопки

Основная кнопка Контурная Маленькая Большая Опасность Успех

Ширина и грид

**Половина** — первая колонка
**Половина** — вторая колонка
33%
67%
25%
75%

Типографика

Жирные заглавные буквы

Курсивный текст

const x = new Map(); // моноширинный

Комбинированный пример

Подписка на обновления

Новые статьи раз в неделю
Подписаться

Критический разбор (Critic Markup)

При совместной редактировании удобно показывать изменения:

Старая версия текста Новая версия текста

Замена целиком: устаревший терминактуальный термин


Эмодзи

Блок поддерживает встроенные эмодзи: 😄 🔥 ❤️ 🌟 🚀 ✨ 💡 :memo: 💻 🖌️


Заголовки с атрибутами

Заголовки можно стилизовать через {:}:

Контакты


Печать

ИИ и блог

Весь блог оптимизирован для печати:

  • Шапка, футер, навигация — скрыты
  • Tabbed-вкладки — все видны, с заголовками
  • Details — всегда развёрнуты
  • Код — с переносом строк
  • Картинки — вписываются в ширину

Нажмите Ctrl+P чтобы попробовать.


ИИ в этом блоге

Часть статей в этом блоге написана при участии ИИ — модели big-pickle через интерфейс opencode. ИИ помогает с:

  • Генерацией и редактированием контента
  • Написанием CSS и JavaScript
  • Настройкой инфраструктуры
  • Созданием изображений через YandexART
  • Документированием кода

Но финальное слово — за человеком. ИИ — инструмент, как Django или Markdown. Он не пишет за вас, он пишет с вами.


Что дальше

  • Санитайзер HTML (nh3) для защиты от XSS через attr_list
  • RSS-лента
  • Комментарии через внешний сервис
  • Полноценный поиск по статьям
  • Экспорт в PDF

Итого

Этот блог — это:

  • Django 6 с кастомной моделью пользователя
  • Markdown с 20+ расширениями
  • Тёмная тема с переключателем
  • Мерmaid-диаграммы и LaTeX-формулы
  • CSS-утилиты через attr_list
  • Автодеплой через git push
  • ИИ как соавтор

Всё работает. Всё бесплатно. Код на GitHub.

bl0g.ru

Комментарии

Пока нет комментариев.

Войдите, чтобы комментировать.