Апр 04

Pinax или all-inclusive для Django

pinax_logo.png

Попалось мне на глаза видео с 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.

Дополнительное чтиво

Апр 03

Python и окружение virtualenv

package.png

Про 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

Дополнительное чтиво

Мар 25

Django-mingus и облако тегов

tag.png В состав 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-х и больше. А дальше дело техники вывести список и оформить по желанию.

Дополнительное чтиво:

Мар 24

Мониторинг сервера под centos и ubuntu

monitoring.png Захотелось мне отслеживать загрузку CPU и памяти на сервере, причем хочу это все видеть красиво: с цветными графиками за определенный период и циферками разными. И еще один критерий отбора — что-бы ставилось быстро и не пришлось долго играться с бубном, мне то надо просто увидеть график и если что-то не так то тогда принимать действия.

Выбор пал на 4 кандидата:

nagios

nagios довольно таки часто освещают в блогах и других обзорных сайтах, потому начал знакомится с темой с него. Из коробки он не умеет показывать графики и, как я понял, надо доставлять отдельно плагины для этого, потому я отказался пока от него. Приведу только ссылки которые собрал на просторах инета:

UPD 15.05.2010 NagiosGrapher - постройка графиков в Nagios.

munin

На данном этапе для меня подходящим решением оказался munin — завелся быстро, через 5 мин. собрались данные о ресурсах сервера и отобразились на графиках — то что я и хотел. Умеет мониторить: работу дисков, сети, процессов, почты, температуру, CPU, память, swap и т. д. мне все этого и не надо, но приятно что есть и можно наблюдать как оно работает.

Для отрисовки графиков используется RRDTool, написан на perl и есть поддержка плагинов. Работает munin по прицепу клиент-сервер, где сервер коннектится с определенной периодичностью к узлам и собирает данные.

cpu-day.png

Демки с примерами работы можно посмотреть тут.

Здесь я опишу как я ставил 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/.htpasswd

require valid-user

Создаем пользователя и пароль:

htpasswd -c /var/www/proft.com.ua/httpdocs/.htpasswd user_name

Дополнительное чтиво:

Сейчас работа munin меня вполне удовлетворяет, но так как у нас остались еще два кандидата то я просто приведу ссылки, которые описывают их установку.

Кстати, один хороший админ из известной хостинговой компании в Украине рассказал, что они чаще используют cacti или zabbix, но мне сейчас вполне хватает munin ;).

cacti

zabbix

Мар 24

Снипетты в VIM

vim-128.png

Сниппет (англ. 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

Подборка ссылок по xptemplate

Мар 18

Обновление блога

track_with_dm.png

Это уже 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, генерирующих статический контент.

Фев 06

Буковель 2009

Съездили в Буковель на три дня, покататься на лыжах. Классно было, мозг перезагружаться полностью. Надо будет в следующем году попробовать на сноуборде.

Янв 19

Крещение 2009

Сегодня большой Христианский праздник - Крещение, с чем я вас и поздравляю!

Сходили сегодня с друзьями к речке и окунулись в проруби, как полагается - трижды. Бодрит :)

Янв 04

Синхронизация контактов между ubuntu и windows mobile

ubuntu_wm.png Зная непредсказуемость работы устройств на 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 был полный список моих контактов, со всеми полями и фотками.

Дополнительный материал:

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

Ubuntu и коммуникатор - настраиваем выход в интернет

Дек 18

Настраиваем связку apache2, mod_wsgi, django под ubuntu, centos

django_apache.png В этом посте опишу последовательность шагов для установки связки 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).

Дополнительный материал:

Цитата

Слышат только те вопросы, на которые в состоянии найти ответ.

Подписаться

    Категории

    Последние записи

    Облако тегов

    Архив

    Полезные ссылки

    Популярные записи