Добрый день, друзья!
Сегодня я хочу рассказать вам о Pelican и о том, как с его помощью можно вести свой блог.
Начнём с того, что же это вообще такое и кому подойдёт. Затем установим Pelican и рассмотрим некоторые неочевидные новичку вещи.
Что это такое?
Pelican - это генератор статических сайтов (SSG 1), реализованный на Python. Статические сайты - те, что не используют какие-либо серверные механизмы построения страниц. Один раз собрали (сгенерировали) контент и потом всегда отображаем его без изменений. Синтаксис файлов - reStructuredText или Markdown (потребуется добавить соответствующий модуль Python).
Для чего это нужно?
Статические сайты - это всё, что не изменяется. Сюда можно отнести сайты-визитки, лендинги 2, прочие сайты, где не требуется динамическая сборка страниц перед выдачей пользователю. И даже блоги, если нет необходимости в CMS и системе прав.
Для чего не подходит?
Ответ следует из написанного выше. Статические сайты не подходят там, где требуется динамика. Они также не подходят, если требуется разграничить права на доступ к страницам. Конечно, можно настроить базовую аутентификацию HTTP, но это будет костыль, который и выглядит не ахти, и возможности имеет очень ограниченные.
Как это работает?
Работает всё довольно просто:
- Устанавливаем Pelican, нужные модули, плагины и тему.
- Настраиваем конфиг.
- Создаём файл и вносим в него данные о странице и само содержимое страницы.
- Запускаем генерацию или локальный сервер.
- Проверяем свою страницу.
- Выгружаем сгенерированный контент сайта на сервер.
Очень полезный момент - в качестве сервера для статического сайта подходит любой хостинг. Можно даже и без хостинга - использовать GitHub Pages.
Что требуется?
Необходимого немного:
- Python 3.6+
- Git (можно и архивом скачать плагины и темы, но Git удобнее)
А вот если хочется комфорта, то добавим:
- PyCharm (или MS Visual Studio Code, но комфортнее продукт от JetBrains, благо есть бесплатный Community Edition)
- venv (в случае с PyCharm заморачиваться не нужно, там всё просто; иначе - ставим и используем руками)
Здесь я буду показывать самый комфортный вариант - с PyCharm. При желании работать с venv вручную, можете обратиться к заметке о нём.
Создадим проект в PyCharm
Меню File > New Project.... Выбираем Pure Python и New environment using Virtualenv.

Если вы делаете без PyCharm, то просто установите virtualenv, создайте виртуальное окружение, перейдите в него и активируйте.
pip install virtualenv
virtualenv test-blog
cd test-blog
source bin/activate
Установим сам Pelican
Сразу можем указать модули, которые нам потребуются для работы (например, плагинов).
pip install pelican webassets Markdown beautifulsoup4
Открываем внизу PyCharm панель Terminal и запускаем инициализацию генератора.
pelican-quickstart
Нас просят ответить на несколько вопросов.

После этого в папке проекта появятся:
- папка content, в которой вы будете создавать и изменять файлы ваших страниц, стилей, картинок и т.п.
- папка output, в которую будут сохраняться сгенерированные файлы вашего сайта
- файл Makefile, если вы ответили
yна вопрос, нужны ли вам скрипты автоматизации генерации и публикации - файл pelicanconf.py, в котором задаются настройки Pelican
- файл publishconf.py с настройками публикации
- файл tasks.py, если вы ответили
yна вопрос, нужны ли вам скрипты автоматизации генерации и публикации
Установим плагины
Если не планируете вести несколько проектов со статической генерацией сайтов, плагины клонируем в папку нашего проекта. Если же проектов у вас несколько, то лучше плагины клонировать в какую-то общую папку. В любом случае переходим в терминале в ту папку, где будем держать плагины и выполняем команду:
git clone --recursive https://github.com/getpelican/pelican-plugins plugins
После завершения в текущей папке появится папка plugins с плагинами.
Открываем файл pelicanconf.py, ищем там PLUGIN_PATHS. Если не нашли - добавляем. Нашли - изменяем. В итоге нам нужно получить:
PLUGIN_PATHS = ['plugins', ]
если клонировали в текущую папку. Если же вы клонировали в другую папку - вместо 'plugins'
указываем путь к этой папке.
Те плагины, что будем использовать, указываем в переменной PLUGINS:
PLUGINS = ['assets', 'neighbors', 'summary']
Установим тему
Чтобы меньше заморачиваться, я рекомендую клонировать себе и все темы из официального репозитория. Делается это аналогично тому, как мы клонировали плагины:
git clone --recursive https://github.com/getpelican/pelican-themes themes
Создаём в папке нашего проекта папку theme. Выбираем тему, которую хотим установить и копируем её в эту папку. Например, я выбрал тему pelican-striped-html5up и скопировал всю её папку в theme.
Копировать тему в отдельную папку я рекомендую по той причине, что может потребоваться её доработка. В таком случае изменять тему в папке, куда клонировали, не лучшая идея - при обновлении официального репозитория придётся чуть больше возиться.
Открываем файл pelicanconf.py и указываем путь к используемой теме:
THEME = 'theme/pelican-striped-html5up'
Настроим конфиг
Настраиваем список ссылок на внешние ресурсы:
LINKS = (
("nornad's python", 'https://python.nornad.com/'),
('кто такой nornad?', 'https://nornad.com/'),
)
SOCIAL = tuple() # мне эти ссылки пока не нужны
Указываем, как должны выглядеть ссылки на страницы и куда их надо сохранять:
ARTICLE_URL = '{date:%Y}/{slug}/' # сделаем адреса статей информативнее
ARTICLE_SAVE_AS = '{date:%Y}/{slug}/index.html' # укажем, что сохранять файлы надо по папкам
PAGE_URL = '{slug}/' # аналогично
PAGE_SAVE_AS = '{slug}/index.html' # для страниц
TAG_URL = 'tag/{slug}' # аналогично
TAG_SAVE_AS = 'tag/{slug}/index.html' # для тегов
CATEGORY_URL = 'category/{slug}' # аналогично
CATEGORY_SAVE_AS = 'category/{slug}/index.html' # для категорий
CATEGORIES_SAVE_AS = 'categories.html' # как сохранить страницу списка категорий
TAGS_SAVE_AS = 'tags.html' # как сохранить страницу списка тегов
YEAR_ARCHIVE_SAVE_AS = '{date:%Y}/index.html' # как сохраняем страницу со ссылками на все записи года
MONTH_ARCHIVE_SAVE_AS = '{date:%Y}/{date:%m}/index.html' # как сохраняем страницу со ссылками на все записи месяца
DAY_ARCHIVE_SAVE_AS = '' # дневные архивы мне не нужны
AUTHOR_SAVE_AS = '' # убираем страницы со списком статей конкретного автора
Укажем, где у нас хранятся картинки и доп.файлы:
STATIC_PATHS = ['images', 'extra', ]
Осталось настроить только расширения Markdown. Нас интересует в первую очередь markdown.extensions.codehilite:
MARKDOWN = {
'extension_configs': {
'markdown.extensions.codehilite': {
'css_class': 'highlight',
'lang_prefix': 'lang-',
'pygments_formatter': 'html',
},
'markdown.extensions.extra': {},
'markdown.extensions.meta': {},
},
'output_format': 'html5',
}
Доработаем тему
Сначала я планировал показать, где и что надо изменить, чтобы понравившаяся мне тема pelican-striped-html5up заработала хотя бы так, как её задумывали. Но этих изменений оказалось слишком много. Поэтому я просто сделал архив (v1:2022-08-14) с доработанной темой. Сразу скажу, что я пока ещё не во все уголки темы залез и наверняка доработка ещё требуется. Буду указывать рядом с архивом дату его обновления и номер версии, чтобы вам проще было понять, изменилось ли что-то.
Создадим заметку
Создание заметки можно условно разделить на два этапа: 1. описание мета-данных (заголовок страницы) 2. написание тела заметки
Создадим в папке content файл hello-world.md. Зададим заголовок:
Title: Hello world!
Date: 2022-08-14 13:50
Author: nornad
Category: hello
Tags: blogging, test
Slug: hello-world
Status: published
Отступаем от заголовка одну пустую строку и пишем саму нашу заметку.
Добавим картинку
Сначала нам надо сохранить картинку в папку content/images. Допустим, ваша картинка называется 1.png. Вставим её на страницу:
Картинка с атрибутом **alt**:

Картинка с атрибутами **alt** и **title**:

Добавим иконку сайта
Скопируйте свою иконку сайта (формата .ico) в проект в папку content/extra. Укажем в конфиге, что её надо скопировать в корневую папку нашего сайта:
EXTRA_PATH_METADATA = {
'extra/cowboy_favicon.ico': {'path': 'favicon.ico'},
}
Поиграем с подсветкой синтаксиса
Просто подсвечиваем код так
```python
from os import getenv
print('hello')
```
или так (с отступами)
:::python
from os import getenv
print('hello')
Если нам нужно показать номера строк, делаем так
```{python linenums=True}
from os import getenv
print('hello')
```
или так (с отступами)
#!python
from os import getenv
print('hello')
Соберём наш сайт
В Linux мы можем использовать Makefile, что упрощает команды.
make html # если нам требуется только сгенерировать сайт
make devserver # если мы желаем ещё и запустить локальный сервер для проверки
Локальный сервер будет доступен по адресу http://127.0.0.1:8000/.
Если же вы работаете с пеликаном в Windows, то команды будут такими:
# make html
pelican content -o output -s pelicanconf.py
# make devserver
pelican -lr content -o output -s pelicanconf.py
Можно, конечно, в Windows 10/11 использовать интегрированный linux, но лично мне он неудобен.
Что дальше?
Осталось только выгрузить содержимое папки output на ваш сервер и проверить, как всё замечательно работает. Если же у вас пока нет хостинга и понимания, как туда выгрузить файлы - не беда. В будущих заметках я рассмотрю пару вариантов.
Полезные ссылки
- Где водятся пеликаны
- Коротенькая и простая статья, которая помогла мне познакомиться с пеликаном
- Инструкция к пеликану
- Модуль подсветки Pygments, стили
- Модуль подсветки Pygments, демо
- Если хочется вставить на страницу символ юникод (например, смайлик) - ищем и копируем здесь
- Краткий справочник синтаксиса Markdown
- Ещё один
- Справочник расширенного синтаксиса Markdown
- Репозиторий плагинов пеликана
- Репозиторий тем пеликана
- Как писать заголовок заметки