Pinax или all-inclusive для Django

Попалось мне на глаза видео с DjangoCon 2008, где Джеймс Таубер восхваляет pinax. А представляет собой pinax сборку из готовых модулей для Django, насчитывается примерно 19 модулей, которые укомплектованы в шаблоны проектов. Эти шаблоны проектов можно взят за основу для своих проектов, и уже на базе них достраивать свой функционал.
Есть каркасы для таких проектов: cms, blog, управление разработкой кода (wiki, отслеживание задач, обсуждения), социальная сеть и еще разные проекты, список которых можно посмотреть по команде (только после установки pinax, см. дальше):
pinax-admin clone_project -l
Пример социальной сети на pinax - Cloud27.
Модули которые идут вместе с pinax (выдрал без изменений с официального сайта):
- openid support
- email verification
- password management
- site announcements
- a notification framework
- user-to-user messaging
- friend invitation (both internal and external to the site)
- a basic twitter clone
- oembed support
- gravatar support
- interest groups (called tribes)
- projects with basic task and issue management
- threaded discussions
- wikis with multiple markup support
- blogging
- bookmarks
- tagging
- contact import (from vCard, Google or Yahoo)
- photo management
and much more coming...
Установка
Скачиваем последнюю версию pinax'a, на момент выхода поста доступна версия 0.7.1.
wget http://downloads.pinaxproject.com/Pinax-0.7.1-bundle.zip
Распаковываем
tar xfv Pinax-0.7.1-bundle.zip cd Pinax-0.7.1-bundle
Так как у меня установлен virtualenv и virtualenvwrapper то я разворачиваю pinax такой командой:
python scripts/pinax-boot.py $WORKON_HOME/pinax-env
Активируем окружение pinax-env
workon pinax-env
Можем обновить django до версии 1.1.1, т. к. вместе с pinax ставится версия 1.0.4
pip install -U Django==1.1.1
Для демонстрации возможностей pinax клонируем проект социальной сети, где подключено больше всего модулей. Переходим в папку где у нас будет жить новый проект и запускаем команду
pinax-admin clone_project social_project mysocnet
А дальше все как обычно:
python manage.py syncdb python manage.py runserver
и в браузере открываем http://localhost:8000/
Документация по последней версии pinax (на момент публикации поста) еще модно место где можно почерпнуть информацию про pinax это канал #pinax на irc.freenode.net.
Дополнительное чтиво
- Серия статей по написанию книжного хранилища от Paolo Corti
- Знакомство с pinax от Fernando Correia
Python и окружение virtualenv

Про virtualenv наверное только ленивый не писал :) и не восхвалял бы, как с ним становится легче разрабатывать и поддерживать модули разных версий на python'e. Этот пост не станет исключением, я опишу как ставить этого зверька и дальше использовать в повседневной кухне.
Нужен virtualenv для создания виртуальных окружений python, внутри которых может, например, использоваться другая версия python (не та что установлена в системе как основная), свой, особый, набор модулей и приложений (нужных под конкретную задачу). И нужно оно для того чтобы, например, протестировать новую версию модуля, не засоряя и не конфликтуя с основным набор модулей или создать проект который будет использовать строго выбранный набор модулей и в будущем не планируется его обновление, в то время как модули, установленные в системе, как основные, могут свободно обновляется.
virtualenv
Для начала ставим pip
sudo easy_install -U pip
Ставим virtualenv
sudo pip install virtualenv
Создаем новое окружение:
mkdir ~/environments/ cd ~/environments/ virtualenv --no-site-packages test
Если в операционной системе стоит несколько версий питонов, то virtualenv можно указать какую версию использовать:
virtualenv --no-site-packages -p python2.6 test
Теперь мы можем наполнять новое окружение необходимыми модулями:
Вариант 1:
pip install -E test/ Django
Вариант 2: сначала активируем наше окружение
source test/bin/activate
В начало строки приглашения в терминале должно будет добавится название нашего окружения (test) это значит, что окружение активировалось. Теперь для всего будет использоваться версия python из этого окружения и видны только модули установленные в это окружение.
Ставим нужные модули:
pip install Django
Что-бы выйти из активированного окружения просто набираем
deactivate
virtualenvwrapper
Для еще большего комфорта при работе с virtualenv Doug Hellmann написал расширение virtualenvwrapper, которое делает все манипуляции с окружениям еще проще.
Ставим virtualenvwrapper
sudo easy_install virtualenvwrapper
Создаем папку, где будут лежать все окружения
mkdir ~/.virtualenvs
Добавляем в файл ~/.bashrc следующие содержание
export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh
Приминяем изменения:
source ~/.bashrc
Создаем новое окружение:
mkvirtualenv blog
Активируем:
workon blog
Деактивируем
deactivate
Удаляем
rmvirtualenv blog
mod_wsgi
Для работы wsgi с созданным окружением добавляем папку site-packages из этого окружения в видимый путь:
import os, sys sys.path = ['/home/proft/environments', '/home/proft/environments/test/lib/python2.6/site-packages', ] + sys.path os.environ['DJANGO_SETTINGS_MODULE'] = 'test.settings' os.environ['PYTHON_EGG_CACHE'] = '/home/proft/environments/test/.python-eggs' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()
cron
Что бы добавить в cron задачу написанную с использованием модулей из созданного окружения надо просто вызвать используемый python из этого окружения:
/home/proft/environments/test/bin/python /home/proft/environments/test/utils/some.py
Дополнительное чтиво
Django-mingus и облако тегов
В состав django-mingus включен модуль для работы с тегами, django-tagging, а вот облако тегов из коробки отсутствует. Но благо django-tagging умеет сам строить облако тегов, а нам надо только немного ему помочь в этом.
Для начала подключим шаблонные теги от django-tagging в базовый шаблон блога, templates/base.html, в самую первую строчку добавляем tagging_tags
{% load disqus_tags flatblock_tags cache navbar generic_content blog compress analytics elsewhere feeds i18n archive tagging_tags %}
Теперь нам остается тока подобрать место (в том файле где мы подключили tagging_tags) где мы хотим вывести теги и вставить такой код
<h4>Облако тегов</h4>
<div id="tagcloud">
{% tag_cloud_for_model blog.Post as tags with steps=6 min_count=2 distribution=linear %}
{% for tag in tags %}
<a href="/tags/{{tag}}/" class="tag-{{tag.font_size}}" title="{{ tag.count }} записей" >{{tag.name}}</a>
{% endfor %}
<div style="clear:both"></div>
</div>
Тут мы указываем, что брать теги с модели blog.Post, диапазон размеров шрифта до 6, брать теги с упоминанием от 2-х и больше. А дальше дело техники вывести список и оформить по желанию.
Дополнительное чтиво:
Мониторинг сервера под centos и ubuntu
Захотелось мне отслеживать загрузку CPU и памяти на сервере, причем хочу это все видеть красиво: с цветными графиками за определенный период и циферками разными. И еще один критерий отбора — что-бы ставилось быстро и не пришлось долго играться с бубном, мне то надо просто увидеть график и если что-то не так то тогда принимать действия.
Выбор пал на 4 кандидата:
nagios
nagios довольно таки часто освещают в блогах и других обзорных сайтах, потому начал знакомится с темой с него. Из коробки он не умеет показывать графики и, как я понял, надо доставлять отдельно плагины для этого, потому я отказался пока от него. Приведу только ссылки которые собрал на просторах инета:
- Установка и настройка Nagios в Ubuntu
- Nagios - мониторинг серверов
- Установка и настройка nagios на Ubuntu
- 10 Nagios Web Frontends
- Nagstamon: Nagios Status Monitor on Debian Sid - плавающая панелька, которая сидит с трее или на рабочем столе и показывает состояние удаленных узлов
UPD 15.05.2010 NagiosGrapher - постройка графиков в Nagios.
munin
На данном этапе для меня подходящим решением оказался munin — завелся быстро, через 5 мин. собрались данные о ресурсах сервера и отобразились на графиках — то что я и хотел. Умеет мониторить: работу дисков, сети, процессов, почты, температуру, CPU, память, swap и т. д. мне все этого и не надо, но приятно что есть и можно наблюдать как оно работает.
Для отрисовки графиков используется RRDTool, написан на perl и есть поддержка плагинов. Работает munin по прицепу клиент-сервер, где сервер коннектится с определенной периодичностью к узлам и собирает данные.

Демки с примерами работы можно посмотреть тут.
Здесь я опишу как я ставил munin под Centos 5.3.
Для установки munin нам понадобится репозитарий RPMforge:
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm
Устанавливаем сервер и клиент:
yum install munin munin-node
Т. к. отслеживаемый узел будет жить там же где и сервер, то добавляем его в загрузку и запускаем:
chkconfig --levels 235 munin-node on /etc/init.d/munin-node start
Теперь серверной части надо указать откуда брать данные и куда ложить, для этого следует отредактировать файл /etc/munin/munin.conf
dbdir /var/lib/munin
htmldir /var/www/proft.com.ua/httpdocs
logdir /var/log/munin
rundir /var/run/munin
tmpldir /etc/munin/templates
[proft.com.ua]
address 127.0.0.1
use_node_name yes
Если эти строки закоментированы, то раскомментируйте их и подправьте значения для htmldir, сюда будут слаживаться результаты собранной статистики. Для того что-бы увидеть результаты пропишите для поддомена этот путь или слаживайте результаты в какую либо папку, видную из интернета. Также подправьте имя узла, которое будет отображаться на странице мониторинга, в моем случае это proft.com.ua.
Для этой папки, указанной в htmldir, нужно установить владельца munin, иначе он не сможет складывать результаты в эту папку.
chown munin:munin /var/www/proft.com.ua/httpdocs
Еще надо добавить пользователя apache в группу munin, иначе на странице будет отображаться Forbidden access, для этого надо подправить файл /etc/group и изменить строчку с группой munin на такую:
munin:x:112:apache
Еще под настроем клиента, в файле /etc/munin/munin-node.conf укажем где у нас находится сервер
host 127.0.0.1
после этого заставляем сервис обновить данные
/etc/init.d/munin-node restart
Все, теперь можете заходить на адрес который вы выбрали и любоваться статистикой. Но т. к. munin не защищает эту папку паролем то мы добавим авторизацию (Basic).
vim /var/www/proft.com.ua/httpdocs/.htaccess
и пишем
AuthType Basic AuthName "Members Only" AuthUserFile /var/www/proft.com.ua/httpdocs/.htpasswdrequire valid-user
Создаем пользователя и пароль:
htpasswd -c /var/www/proft.com.ua/httpdocs/.htpasswd user_name
Дополнительное чтиво:
- Server Monitoring With munin And monit On CentOS 5.2
- Server Monitoring With munin And monit On Ubuntu
- Monitoring Servers and Clients using Munin in Ubuntu
- How to Install Munin on CentOS
Сейчас работа munin меня вполне удовлетворяет, но так как у нас остались еще два кандидата то я просто приведу ссылки, которые описывают их установку.
Кстати, один хороший админ из известной хостинговой компании в Украине рассказал, что они чаще используют cacti или zabbix, но мне сейчас вполне хватает munin ;).
cacti
- Установка cacti 0.8.7e (centos+apache+mysql+php+snmp)
- Installing Cacti on Red hat/CentOS/Fedora
- Installing Cacti on CentOS 5
- Install and Configure Cacti Network Graphing Tool
zabbix
Снипетты в VIM

Сниппет (англ. snippet — фрагмент, отрывок) — программный термин, обозначающий небольшой фрагмент исходного кода или текста, пригодного для повторного использования. (wikipedia)
В vim'e существует поддержка сокращений (iabbrev), для простой замены вполне сгодится, но если надо что-то по изощреннее то существуют два достойных кандидата snipMate и xptemplate(XT).
Из коробки
Пример поддерживаемых сокращений в виме
iabbrev bt iabbrev ddate=strftime("%d.%m.%Y")
snipMate
snipMate позиционирует себя как реализатор сниппетов из TextMate, но лично мне он не подошел:
- во-первых дополнение по tab'у у меня проглуючивало, т.к. на этой клавише у меня висит функция, которая заменяет пачку других дополнений при редактировании (дополнение путей, уже набранного текста и т. д.). Признаться честно я не захотел играться над тем что бы подружить функцию и snipMate, см. дальше про XT;
- во-вторых нету всплывающего окна, рядом с курсором, с выбором вариантов, а появляется небольшой регион в нижней части окна (над строкой состояния) со списком выбора, то есть для выбора первого элемента введите 1, для второго - 2, и т.д., имхо это дико, проще и удобней всплывающее окно как у XT возле курсора;
- набор возможностей по дописыванию своих сниппетов у snipMate будет попроще чем у XT. Например в snipMate нельзя в шаблоне def func_name(arg1) после arg1 нажать tab и получить еще один параметр Также в snipMate более бедный набор готовых сниппетов для python и почти нет для css.
Но snipMate более популярен в vim среде и для него существует больше готовых сниппетов, но это не особо большой аргумент в пользу него, т.к. затратив немного времени и изучив синтаксис XT можно писать более гибкие удобные сниппеты.
xptemplate
А теперь гвоздь программы - xptemplate для меня во всех параметрах лучше чем snipMate. Все что я указал выше как недостатки snipMate, в xptemplate есть и замечательно работает.
Я написал пачку сниппетов для django и django templates — vim_xp_django.tar.gz. Распаковать в папку ~/.vim/. В архив попали наиболее часто используемые поля моделей, теги и блоки для шаблонов. Со временем архивчик будет обновляться, а на первое время этого должно хватить. Также буду рад видеть ваши дополнения ;).
Подборка ссылок по snipMate
- snipmate-snippets - подборка готовых сниппетов
- snipmate_for_django - подборка сниппетов для django. Демка
- snipMate.vim Introductory Screencast - скринкаст о snipMate
- Vim Plugins: snipMate
- How to use TextMate like snippets in vim?
Подборка ссылок по xptemplate
Обновление блога

Это уже 4-ое обновление сайта, на котором я пишу разные свои мысли, заметки и другие умозаключения :). Все начиналось в 2002 году с бесплатного хостинга на nm.ru, потом был самописный движок на PHP, после которого я перешел на Wordpress. А теперь на дедике бежит django-mingus, это такой блоговый движок на djanga (если кто не знает), в общем наблюдается некая тенденция в развитии блого-строения :).
Почему django-mingus? Выбор был не прост, сначала я присматривался к byteflow.su от Александра Соловьëва, но последние изменения датированы 25.05.2009, не смертельно, но как-то настораживает. После небольшой переписки с автором выяснилось, что проект заморожен на неизвестный срок и ищутся мейнтейнеры, если кто желает поучаствовать, то велкам к @asolovyov.
Потом я посмотрел на zine, это попытка написать блоговый движок, схожий с WordPress'ом, на python'е. Смотрел не долго :) последние изменения датированы январем 2009 года — тоже отложил и продолжил поиски.
Читал хорошие отзывы о django-mingus, автор Kevin Fricovsky. Кстати, от Кевина есть обзор 11 блоговых движков на Django. Django-mingus это компоновка из около 28 апликейшенов, написанных как отдельные модули для django. Последняя версия вышла в феврале этого года. Поставил, потестил — богатый набор возможностей, есть набор симпотных тем :), написан на django (для меня это плюс :) ). Мне все почти понравилось, за исключением импорта из WordPress'a и редактирования статей — все это решаемо, но после WordPress как-то лень делать лишние телодвижения :) .
Импорт из WordPress не предусмотрен, но Jochen Maes написал скрипт как импортировать. Но импорт не цепляет теги, линки на картинки и другой материал, размещенный в структуре каталогов WordPress'a — придется перебивать вручную или игратся с regexp.
Редактирование постов возможно с помощью Markdown и двух встроенных WYSIWYG-редакторов. Но последние два не умеет загружать картинки и другую мультимедию как это сделано в WordPress'e: выбираем что грузить, откуда и вставляем в в пост. Редакторы в django-mingus умеют только ссылаться на ресурсы через url, но аплоадить не могут (плохо искал?). Сам Кевин посоветовал использовать Basic-Inlines или AdminImageWidget, но, имхо, надо делать много лишних телодвижений в случаи первого варианта и перелапачивать изменения в модели постов (а модуль требует внести небольшие правки) при выходе новой версии django-mingus, в случаи второго варианта.
Потому я решил пойти такой дорогой: все посты были перенесены вручную (fuck), но есть и позитивные плюсы: была произведена реструктуризация постов по категориям, обновлены ссылки на умершие ресурсы … просушены отложенные подкасты :). Этот способ импорта гарантировал что с постами, связанными категориями, тегами, мультимедией все будет ок, но оказался, к сожалению, долгим и монотонным. А в качестве способа редактирования решил остановится на Markdown, меня он почти устраивает.
Описание разметки есть в wiki или на stackoverflow.com.
И еще одно маленькое но, комментарии к постам не были перенесены. Во-первых стало лень возится :), во-вторых в django-mingus используется disqus и переезд мог затянутся на еще не определенное время.
Не сложный процесс установки django-mingus описан тут.
Пока знакомился с django-mingus перевел на русский язык некоторые куски, которые не были переведены до конца; поменял отображение списка тегов для поста — теперь они выводятся через запятую. Все изменения есть в файле django_mingus_ext.tar.gz
И кстати у Кевина не исчерпался интерес к своему детищу, есть планы на следующие версии, о чем он писал на djangoadvent.com
В целом переезд удался, ждите новых и интересных постов в ближайшем будущем :)
И на последок немного джаза от Чарльза Мингуса
UPD 27.04.2010
Генераторы статических блогов - небольшой обзор блог-движков, на python, генерирующих статический контент.
Буковель 2009
Крещение 2009
Синхронизация контактов между ubuntu и windows mobile
Зная непредсказуемость работы устройств на windows mobile рекомендуется хранить контакты в разных 'корзинах'. И потому стал вопрос: как сохранить все контакты на рабочий комп под ubuntu 9.10?
Под windows был ActiveSync (или Центр чего-то ... под windows7), который вроде бы и синхронизировал с Outlook, но после установки на коммуникатор программы для занесения всех дней рождений контактов в календарь синхронизация поломалась, с тех пор я про синхронизацию забыл.
Дальше описывается рабочий процесс синхронизации ubuntu 9.10 и коммуникатора с windows mobile 6.1. После синхронизации все контакты будут аккуратно лежать в Evolution, которые дальше можно бекапить, например, в формат vCards. Кстати последние очень просто и быстро импортируются в Android.
Ниже описанный процесс, в редких случаях, может повести себя не предсказуемо, потому для сохранения нервных клеток :) рекомендуется сохранить все контакты на КПК с помощью PIM Backup.
Добавляем в /etc/apt/sources.list репозитарий с synce:
deb http://ppa.launchpad.net/synce/ubuntu karmic main deb-src http://ppa.launchpad.net/synce/ubuntu karmic main
Добавляем ключ авторизации:
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B152F042D246C25D
Обновляемся и ставим нужные пакеты:
sudo apt-get update && sudo apt-get install synce-hal librra-tools librapi2-tools multisync-tools opensync-plugin-synce synce-sync-engine
Подключаем устройство к ПК и проверяем связь:
synce-pls
Должен появится список папок на устройстве.
Иногда при подключении гаджета, в трее ubuntu, не появляется иконка от synce, это лечится либо переподключением девайса либо установкой пакета synce-trayicon:
sudo apt-get install synce-trayicon
Создаем новый профиль:
synce-create-partnership "UbuntuDesktop" "Contacts,Calendar,Tasks,Files"
Просмотр существующих профилей:
synce-list-partnerships
Управление профилями через GUI:
sudo apt-get install synce-kpm synce-kpm
Создаем в msynctool группу для синхронизации:
msynctool --addgroup UbuntuDesktop msynctool --listgroups msynctool --addmember UbuntuDesktop synce-opensync-plugin msynctool --addmember UbuntuDesktop evo2-sync
Проверка группы:
msynctool --showgroup UbuntuDesktop
Синхронизируемся. У меня с первого раза не процесс не пошел, выкинуло ошибку и остановилось. С повторным запуском все пошло как по маслу. Warning: перед синхронизацией, забекапте свои контакты в КПК и в Evolution.
msynctool --sync UbuntuDesktop
После этого у меня в Evolution был полный список моих контактов, со всеми полями и фотками.
Дополнительный материал:
- How to sync Evolution contacts with PDA (Windows Mobile) in Ubuntu 9.10
- Синхронизация Windows Mobile 6 с ubuntu karmic
- Синхронизация телефона с Evolution через интернет или как подружить Evolution с SyncML сервером
UPD 23.06.2010
После выхода Ubuntu 10.04 и смены работы с устройствами, в частности отключение HAL привело к тому, что синхронизация с коммуникатором на windows mobile поломалась и пока мне не известно как возобновить синхронизацию контактов с Evolution. Но работу с файловой системой (память телефона и флешка) получилось реанимировать, для этого вносим в /etc/apt/sources.list репозитарий с synce для lucid:
deb http://ppa.launchpad.net/synce/ubuntu lucid main deb-src http://ppa.launchpad.net/synce/ubuntu lucid main
Обновляемся и ставим нужные пакеты:
sudo apt-get update && sudo apt-get install synce-hal librra-tools librapi2-tools multisync-tools opensync-plugin-synce synce-sync-engine synce-gvfs
UPD 24.06.2010
Настраиваем связку apache2, mod_wsgi, django под ubuntu, centos
В этом посте опишу последовательность шагов для установки связки apache2, mod_wsgi 3.2, django 1.1 под ubuntu 9.10 и centos 5.4.
Под ubuntu 9.10
Ставим apache2
Устанавливаем apache2 и сопутствующие модули:
sudo apt-get install apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1 ssl-cert build-essential
Ставим mod_wsgi
Подготовки перед сборкой mod_wsgi 3.2 для apache2.
cd ~/sources wget http://modwsgi.googlecode.com/files/mod_wsgi-3.2.tar.gz tar xvfz mod_wsgi-3.2.tar.gz cd mod_wsgi-3.2/
Что бы при сборке не ругалось на отсутствующий apxs и ошибку вида make: *** [mod_wsgi.la] Error 1 устанавливаем два дополнительных пакета:
sudo apt-get install python-dev apache2-prefork-dev
После всех подготовок собираем и ставим mod_wsgi.
./configure make sudo checkinstall
Говорим апачу о новом модуле и активируем его.
sudo echo "LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so" > /etc/apache2/mods-available/wsgi.load sudo a2enmod wsgi
Ставим mysql
sudo apt-get install mysql-server python-mysqldb mysql-client
После установки должно предложить ввести root'овый пароль, если нет то вводим:
mysqladmin -u root password [PASSWORD]
Ставим расширения для python
sudo apt-get install python-setuptools easy_install virtualenv easy_install virtaulenvwrapper easy_install pip
Ставим django 1.1
Скачиваем последнюю стабильную версию и распаковываем:
cd ~/sources wget http://www.djangoproject.com/download/1.1/tarball/ tar xzf Django-1.1.tar.gz -C /opt/
Смотрим где у нас лежат все модули для python.
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
Делаем симлинк на распакованную ранее django в папку с модулями python.
sudo ln -s /opt/Django-1.1/django /usr/lib/python2.6/dist-packages
Делаем django-admin.py видимым отовсюду.
sudo ln -s /opt/Django-1.1/django/bin/django-admin.py /usr/bin
Проверяем установленную django.
python -c "import django; print django.VERSION;"
Должно вернуть что-то похожие.
(1, 1, 0, 'final', 0)
Создаем тестовый проект blog.local
cd /var/www/ mkdir myblog cd myblog/ mkdir -p static logs .python-eggs django-admin.py startproject blog
Добавляем URL myblog.local в /etc/hosts
sudo echo "127.0.0.1 myblog.local" >> /etc/hosts
В папке /etc/apache2/sites-available/ создаем файл myblog.conf с таким содержимым:
ServerName myblog.local CustomLog /var/www/myblog/logs/access_log combined ErrorLog /var/www/myblog/logs/error_log Alias /media /opt/Django-1.1/django/contrib/admin/media Alias /static /var/www/myblog/static WSGIScriptAlias / /var/www/myblog/myblog.wsgi WSGIDaemonProcess myblog.local processes=7 threads=1 display-name=%{GROUP}
В папке /var/www/myblog/ создаем файл myblog.wsgi:
import os, sys
sys.path.append('/var/www/myblog/blog')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/myblog/.python-eggs'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Активируем новый сайт и перегружаем апач:
sudo a2ensite myblog.conf sudo apache2ctl restart
Под centos 5.4
Ставим нужные пакеты:
sudo yum install httpd-devel gdbm-devel mysql mysql-server mysql-devel mysql-client sudo yum install readline-devel sqlite-devel openssl-devel ncurses-devel sudo yum install apr-devel gcc make autoconf mod_ssl crypto-utils sudo yum install bzip2-devel zlib-devel libjpeg libpng libxslt gettext
Ставим новый python
По умолчанию с centos 5.4 идет python 2.4.3, обновим его до python 2.6.4.
cd ~/sources wget http://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz tar xvfz Python-2.6.4.tgz cd Python-2.6.4/
Собираем новый python.
./configure --prefix=/opt/python2.6 --with-threads --enable-shared --with-zlib=/usr/include make make install
Делаем python2.6 видимый для всех. Создаем файл /etc/ld.so.conf.d/opt-python2.6.conf и пишем в него /opt/python2.6/lib.
ln -s /opt/python2.6/lib/libpython2.6.so /usr/lib ln -s /opt/python2.6/lib/libpython2.6.so.1.0 /usr/lib ldconfig -v
Делаем симлинк на новую версию python.
ln -s /opt/python2.6/bin/python /usr/bin/python2.6
Ставим setuptools.
cd ~/sources wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg sh setuptools-0.6c11-py2.6.egg --prefix=/opt/python2.6
Ставим MySQLdb.
cd ~/sources wget http://downloads.sourceforge.net/project/mysql-python/mysql-python-test/1.2.3c1/MySQL-python-1.2.3c1.tar.gz tar xvfz MySQL-python-1.2.3c1.tar.gz cd MySQL-python-1.2.3c1/ python setup.py build python setup.py install
Проверяем MySQLdb.
python2.6 -c "import MySQLdb"
Если все ок, то ничего не должно вернуть.
Ставим mod_wsgi
Установка.
cd ~/sources wget http://modwsgi.googlecode.com/files/mod_wsgi-3.2.tar.gz tar xvfz mod_wsgi-3.2.tar.gz cd mod_wsgi-3.2/ ./configure --with-python=/opt/python2.6/bin/python2.6 make make install
Что бы apache2 (или httpd под centos) увидел mod_wsgi надо добавить в httpd.conf:
LoadModule wsgi_module /usr/lib/httpd/modules/mod_wsgi.so
Ставим django 1.1
Скачиваем последнюю стабильную версию и распаковываем:
cd ~/sources wget http://www.djangoproject.com/download/1.1/tarball/ tar xzf Django-1.1.tar.gz -C /opt/
Смотрим где у нас лежат все модули для python.
python2.6 -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
Делаем симлинк на распакованную ранее django в папку с модулями python.
ln -s /opt/Django-1.1/django /opt/python2.6/lib/python2.6/site-packages/
Делаем django-admin.py видимим отовсюду.
ln -s /opt/Django-1.1/django/bin/django-admin.py /usr/bin
Проверяем установленную django.
python2.6 -c "import django; print django.VERSION;"
Должно вернуть что-то похожие.
(1, 1, 0, 'final', 0)
Создаем тестовый проект blog.local
cd /var/www/ mkdir myblog cd myblog/ mkdir -p static logs .python-eggs django-admin.py startproject blog
Добавляем URL myblog.local в /etc/hosts
echo "127.0.0.1 myblog.local" >> /etc/hosts
В папке /etc/httpd/conf.d/ создаем файл myblog.conf с таким содержимым:
ServerName myblog.local CustomLog /var/www/myblog/logs/access_log combined ErrorLog /var/www/myblog/logs/error_log Alias /media /opt/Django-1.1/django/contrib/admin/media Alias /static /var/www/myblog/static WSGIScriptAlias / /var/www/myblog/myblog.wsgi WSGIDaemonProcess myblog.local processes=7 threads=1 display-name=%{GROUP}
В папке /var/www/myblog/ создаем файл myblog.wsgi :
import os, sys
sys.path.append('/var/www/myblog')
os.environ['DJANGO_SETTINGS_MODULE'] = 'blog.settings'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/myblog/.python-eggs'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Перегружаем апач:
service httpd restart
После этого всего у меня ругалось на ошибку 500 Internal Server Error, а в логе писало ImportError и ругалось Persmission denied на либу _functools.so. Вылечилось отключением SELinux в Text Mode Setup Utility (команда setup).
Дополнительный материал:







