Python CMS
Не буду углубляться в терминологию, думаю что те кто зашел на мой блог и так прекрасно осведомлены о том что такое CMS. Для всех веб разработчиков всегда существует дилема выбора готовой CMS или написания своей собственной. Поскольку я не занимаюсь созданием сайтов в промышленных масштабах, то пытаюсь найти нечто готовое, изучить и по-возможности переиспользовать. В моем подходе есть недостатки, так как редко получается найти на 100% подходящее решение и зачастую кода больше чем необходимо. Но этот подход, с чем невозможно поспорить, увеличивает скорость разработки и улучшает кругозор, потому что исследуется чужой код. В основном, в работе я использую Django Framework. Но появилась необходимость в системе управления статическими страницами, для которой встроенное приложение django static pages уже недостаточно. Держать Django приложение для простого 10 страничного сайта, это неразумно, хоть я в итоге и делаю теперь так, в угоде других приоритетов, несколько сайтов на одной CMS, правильный шаблонизатор с наследованием. Но изначально хотелось что-нибудь поменьше, а также более юзерфрэндли для конечных пользователей. Так чтобы пользователь без лишних вопросов мог добавить страничку, отредактировать ее в tinymce или добавить видео из youtube лего и бысто. В общем набор как всегда взаимоисключающих требований. Но первое и самое важное для меня - это обязательно язык программирования Python. И в данном сегменте я нашел более 10 хороших вариантов, для изучения:
- Django CMS - основан на django
- PyLucid - основан на django
- Mezzanine - основан на django
- Pinax - основан на django
- Merengue - основан на django
- FeinCMS - основан на django
- DjangoLFC - быстрая CMS на django
- Plone - большой Zope основанный
- Kotti - основано на Pyramid
- Quokka project - основан на Flask (база данных MongoDB)
- Skeletonz
- NiVE
- ikaaro
- wagtail
- bottle - вообще micro cms
и так далее...
Сразу выбрал DjangoCMS, но она меня не впечатлила, осталась такой же как и была 10 лет назад и как всегда с ней установилось 100500 пакетов, дизайн меня не впечатлил, сложно обучать человека работать с админкой, Kotti - абсолютно другой подход и совершенно не известная для меня технология (обязательно к этому еще вернусь), Quokka пожалуй одна из лучших систем на сегодняшний день, очень удачная для пользователя, не перегруженная, современная, лишенная недостатков концепции фундамента, в виде больших фреймворков. Но есть одно но - это база данных MongoDB, если бы была база данных PostgreSQL то я бы выбрал её. После изучения каждого из вариантов, времени осталось мало и я решил - выберу что-нибудь более ли менее стабильное, то что я знаю, не перегруженное, и поскольку выяснилось, что Django cms приложение - Django cms приложению рознь мой выбор пал на FeinCMS.
О ней я сегодня и напишу.
FeinCMS
CMS написанная на Python, основана на Django, а в Django есть коровья сила - это значит, что при установке CMS у нас будут все бесчисленные возможности фреймворка Django. Библиотека содержит множество готовых решений для повседневных задач веб разработчика, позволяет быстро стартовать, а язык разработки гарантирует вам хорошую поддерживаемость кода. FeinCMS - это больше, чем система управления контентом (не только благодаря Django). Например, FeinCMS позволяет определить свои типы содержимого (Content Type), таким образом CMS представляется уже системой разработки веб приложений. В админке же есть все необходимое прямо из коробки для управления пользовательским контентом.
Важно! Принципы установки FeinCMS теже, что и у любого другого Django приложения. Это руководство будет также полезно для начинающих знакомиться с фреймворком Django.
К плюсам FeinCMS можно отнести также наличие, отнюдь не исчерпывающей, но официальной документации на readthedocs.org
Подготовка к установке FeinCMS
Необходимо обновить операционную систему. Все команды выполеняются под привелегированной учетной записью (от root)
# apt-get update
# apt-get upgrade
Далее установим необходимые библиотеки необходимые для работы Python и для установки его модулей
# apt-get install build-essential python-virtualenv git-core python-dev libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev libpq-dev
Установка FeinCMS
Настроим виртуальное окружении, чтобы безопасно для системы установить FeinCMS со всеми зависимостями.
# mkdir /web/cms/logs scripts sql -p
# cd /web/cms/
# virtualenv -ppython2.7 env
Активируем виртуальное окружение
# source env/bin/activate
На сегодня 5 апреля 2015 у FeinCMS существуют проблемы с django 1.8, поэтому перед установкой cms следует установить django 1.7, остальные зависимости подтянутся вместе с FeinCMS.
pip install pytz django==1.7 feincms
Successfully installed feincms feedparser Django Pillow django-mptt
Установим модуль для работы с базой данных в моем случае это PostgreSQL (для MySQL mysql-python)
pip install psycopg2
Подготовка FeinCMS
Для запуска FeinCMS необходимо создать Django проект, в настройках которого прописать приложение feincms.
django-admin.py startproject feincms_project
cd feincms_project
Необходимо создать пользовательское приложение cms
python manage.py startapp cms
Изменим файл настроек Django в соостветствии с приложениями
nano feincms_project/settings.py
Внесем изменения в кортеж INSTALLED_APPS, добавим feincms приложения и cms:
INSTALLED_APPS = (
# FeinCMS:
'feincms',
'feincms.module.page',
'feincms.module.medialibrary',
'cms',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
Необходимо изменить настройку базы данных
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'dbname',
'USER': 'user',
'PASSWORD': 'secret',
'HOST': '',
'PORT': '',
}
}
Для запуска необходимо удалить или закомментировать строчку security в кортеже MIDDLEWARE_CLASSES
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'django.middleware.security.SecurityMiddleware',
)
Подправим директорию поиска тэмплейтов:
TEMPLATE_DIRS = (
os.path.dirname(__file__) + '/templates/',
)
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.static'
)
Для работы нужно urls.py привести к виду
nano feincms_project/urls.py
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.contrib import admin
admin.autodiscover()
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('feincms.contrib.preview.urls')),
url(r'', include('feincms.urls'))
]
urlpatterns += patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT})
)
Создание базы данных
Для работы FeinCMS требуются модели. Это отличие этой CMS от других. Поэтому прежде чем создать базу данных необходимо создать модели.
nano cms/models.py
# -*- coding: utf-8 -*-
from feincms.module.page.models import Page
from feincms.content.richtext.models import RichTextContent
Page.register_templates({
'title': 'Основной темплейт FeinCMS',
'path': 'template1.html',
'regions': (
('header', 'Шапка'),
('main', 'Содержимое'),
('sidebar', 'Сайдбар', 'inherited'),
('footer', 'Подвал'),
),
})
Page.create_content_type(RichTextContent)
Полное описание Page модуля FeinCMS в документации
Инициализируем базу данных
python manage.py syncdb
Создание темплейта
Нуобходима директория для хранения темплейтов
mkdir feincms_project/templates
Отредактируем темплейт модели, которую мы создали выше
nano feincms_project/templates/template1.html
<div id="header">
{% block header %}
{% for content in feincms_page.content.header %}
{{ content.render }}
{% endfor %}
{% endblock %}
</div>
<div id="content">
{% block content %}
{% for content in feincms_page.content.main %}
{{ content.render }}
{% endfor %}
{% endblock %}
</div>
<div id="sidebar">
{% block sidebar %}
{% for content in feincms_page.content.sidebar %}
{{ content.render }}
{% endfor %}
{% endblock %}
</div>
<div id="footer">
{% block footer %}
{% for content in feincms_page.content.footer %}
{{ content.render }}
{% endfor %}
{% endblock %}
</div>
Тестируем приложение
Запустим тестовый Django сервер
python manage.py runserver
Заходим в Django админку и создаем страницы на основе нашей модели
http://127.0.0.1:8000/admin/
Спасибо за внимание! Статья обязательно будет обновляться в соответствии с вашими комментариями. Да, еще, ;) если статья была вам полезна, щелкните по рекламе.