В последнее время очень активно ведется работа над созданием новых языков и портированием существующих на платформу Java. Многие аналитики утверждают что за этими языками будуйщее. Одним из таких языков стал Python. Его порт, работающий на JVM, называется Jython.
Я уже писал о портировании различных web-фреймворков на Jython, описывал проблемы запуска Trac на Jython, а сегодня я расскажу о успешном опыте запуска популярного blog-engine Byteflow на Jython.
Byteflow использует для своей работы Django, согласно многим источникам в интернет этот популярный web-framework успешно портирован на Jython этим летом.
Этап первый, подготовительный (установка Java, Jython, Django):
Я надеюсь у вас уже установлена Java (рекомендую использовать 6ую версию от SUN, т.к. я не пробовал еще запускать Jython на OpenJDK).
Ставим Jython (в данный момент последней версией является 2.5b0), рекомендую использовать последнюю “стабильную”:
$wget http://kent.dl.sourceforge.net/sourceforge/jython/jython_installer-2.5b0.jar
$java -jar jython_installer-2.5b0.jar
Вот тут, если у вас на машине не стоит X-сервер, могут возникнуть первые проблемы:
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
С помощью гугля и здравого смысла находим способ запустить консольную версию инсталятора:
$java -jar jython_installer-2.5b0.jar --console
Сразу после установки нам нужно дать права на исполнение интерпритатору Jython:
$chmod +x /mnt/data/java/jython2.5b0/bin/jython
Проверяем работоспособность Jython:
$ /mnt/data/java/jython2.5b0/bin/jython
Jython 2.5b0 (trunk:5540, Oct 31 2008, 13:55:41)
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.6.0_04
Установка Django:
Django с версии 1.0 официально работает на Jython, поэтому скачиваем последнюю стабильную версию (в данный момент ею является 1.0.2) и устанавливаем её с помощью Jython:
$wget http://www.djangoproject.com/download/1.0.2/tarball/
$tar xjvf Django-1.0.2-final.tar.gz
$cd Django-1.0.2-final
$jython setup.py install
Процесс сборки Django может затянуться на несколько минут, но в результате все должно собраться без каких-либо ошибок и проблем.
Этап второй, запуск Byteflow:
Byteflow активно развивается, поэтому лучше всего брать текущую версию из репозитария:
$hg clone http://hg.piranha.org.ua/byteflow/
$cd byteflow
Согласно инструкции по установке вносим необходимые изменения в settings_local.py и пытаемся инициализировать БД:
jython manage.py syncdb
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
....
File "/mnt/data/java/jython2.5b0/Lib/site-packages/django/db/backends/mysql/base.py", line 13, in <module>
raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb
Проблема заключается в том что для Jython необходимо использовать специальные class-wrapper для работы с БД, т.к. низкоуровневой работы с БД используется JDBC драйверы для Java. Поэтому мы не можем использовать стандартные python реализации DB 2 API.
Для решения проблем с database backend мы воспользуемся проектом django-jython, в рамках которого были разработканы Jython DB2 API wrapper для PostgreSQL и SqLite3.
Устанавливаем последнюю версию из svn:
$svn co http://django-jython.googlecode.com/svn/trunk/ django-jython
$cd django-jython
$jython setup.py install
В данный момент MySQL не поддерживается, но работа ведется и возможно скоро уже будет реализован wrapper и для MySQL.
Для использования нашего backend’а в byteflow надо изменить переменную DATABASE_ENGINE:
DATABASE_ENGINE = 'doj.backends.zxjdbc.postgresql' # variants: mysql, sqlite3
Вновь пробуем инициализировать БД, и вновь получаем ошибку: `
$jython manage.py syncdb
Error: No module named BeautifulSoup `
Скачиваем и устанавливаем BeautifulSoup для Jython:
$wget http://www.crummy.com/software/BeautifulSoup/download/BeautifulSoup.tar.gz
$tar xzvf BeautifulSoup.tar.gz
$cd BeautifulSoup-3.0.7a
$jython setup.py install
В процессе сборки возникает некоторое количество ошибок при прохождении внутренних тестов, но в данный ммоент мы на это внимание не обращаем.
Теперь вновь запускаем инициализацию БД:
$jython manage.py syncdb
zxJDBC.DatabaseError: driver [org.postgresql.Driver] not found
Данная ошибка говорит нам о том что нужно установить jdbc драйвер для PostgreSQL. Опять идем на сайт разработчиков и выбираем подходящий драйвер, я рекомендую взять стабильный 8.3 JDBC 3:
$wget http://jdbc.postgresql.org/download/postgresql-8.3-604.jdbc3.jar
Теперь можно вновь запустить инициализацию БД (но теперь мы это делаем некоторым изощренным способом):
$/usr/bin/java -classpath /opt/java/jython2.5b0/jython-complete.jar:/home/blaze/Desktop/postgresql-8.3-604.jdbc3.jar
-Dpython.home="$JYTHON_HOME" org.python.util.jython manage.py syncdb
Перед выполнением следующего этапа нам необходимо создать пользователя и БД для byteflow.
О создании пользователя лучше читать в руководстве PostgreSQL, я создал пользователя следующими командами(необходимо выполнять из-под пользователя postgres):
$createuser byteflow -P -S -D -R
$createdb byteflow -O byteflow
После этого БД должна инициализировать успешно, и мы можем переходить к запуска тестового сервера:
$/usr/bin/java -classpath /opt/java/jython2.5b0/jython-complete.jar:/home/blaze/Desktop/postgresql-8.3-604.jdbc3.jar
-Dpython.home="$JYTHON_HOME" org.python.util.jython manage.py runserver
В качестве дополнения хочу отметить что для корректной работы Byteflow необходимо еще установить модуль ElementTree, у которого уже есть порт на Jython :
$svn checkout http://jython-elementtree.googlecode.com/svn/trunk elementtree
$cd elementtree
$jython setup.py install --stdlib
модуль openid:
$wget "http://openidenabled.com/files/python-openid/packages/python-openid-2.2.1.tar.bz2"
$jar xzvf python-openid-2.2.1.tar.bz2
$cd python-openid-2.2.1
$jython setup.py install
А также необходимо отключить catpcha в настройках Byteflow, либо использовать recaptcha, т.к. для работы она требует PIL, которая не портирована на Jython. Возможно будет работать вариант с recatpha, но это надо проверить.
Ссылки по теме:
Distribs:
Modules:
Articles: