В прошлом посте я презентовал Nagare — революционный (хоть и имеющий аналоги на Smalltalk и CL) питоновский web-фреймворк. Тот пост был несколько сумбурен и отражал, скорее, степень моего восторга, чем реальные особенности технологии. Сегодня я попробую дать немного более практический пример.
Начнем сначала. Прежде всего, нам потребуется Stackless Python. Для инсталляции на FreeBSD (далее, я буду использовать эту систему в качестве базы, для Linux отличий быть не должно, для MacOS и Windows есть особенности, но они не критичны) необходимо скачать дистрибутив:
распаковать его:
сконфигурировать (инсталлировать будем в /usr/local/stackless)
скомпилировать и установить:
Вообще-то, наиболее правильным было бы инсталлировать stackless-python через систему ports, но он в ней почему-то отсутствует.
Теперь нам нужно скачать и распаковать virtualenv:
после чего создать виртуальную «песочницу», в которой будет работать Nagare (/usr/local/nagare):
Теперь, нужно установить, собственно, сам Nagare:
Все, Nagare установлен и готов к работе.
Создадим приложение:
Будет создан каталог test1, содержащий следующие файлы:
./test1/setup.py
./test1/test1/__init__.py
./test1/test1/app.py
./test1/test1/models.py
./test1/static/__init__.py
./test1/data/__init__.py
./test1/conf/__init__.py
./test1/conf/test1.cfg
Файл setup.py содержит всякую служебную информацию типа лицензии, имени автора, его email и т.п., для тестового приложения можно его не заполнять, работать будет и так.
В файле conf/test1.cfg включим режим отладки и подключим БД (по умлочанию — sqlite). После исправлений он будет выглядеть так:
Теперь выполним команду:
Все, приложение зарегистрировано, можно его протестировать:
По умолчанию приложение будет доступно по адресу \http://127.0.0.1:8080/test1.
Приступим к разработке.
Сначала зададим таблицы базы данных. Для этого отредактируем файл test1/models.py, добавив определения таблиц (интересующихся подробностями отошлю к документации Elixir). В итоге, файл будет выглядеть так:
Создадим саму базу данных:
Теперь запрограммируем простейшую гостевую книгу. Для этого файл test1/app.py отредактируем следующим образом:
Запустив приложение командой:
По адресу \http://127.0.0.1:8080/test1 мы обнаружим премилую гостевую книгу, в стиле «привет из 90-х».
Приведенный выше пример не раскрывает и 10% возможностей Nagare и приведен только для примера. В следующий раз я покажу, как при помощи Nagare можно создавать более сложные приложения.
Начнем сначала. Прежде всего, нам потребуется Stackless Python. Для инсталляции на FreeBSD (далее, я буду использовать эту систему в качестве базы, для Linux отличий быть не должно, для MacOS и Windows есть особенности, но они не критичны) необходимо скачать дистрибутив:
$ fetch \http://www.stackless.com/binaries/stackless-264-export.tar.bz2
распаковать его:
$ tar -xvjf stackless-264-export.tar.bz2
сконфигурировать (инсталлировать будем в /usr/local/stackless)
$ cd stackless-2.6.4
$ ./configure --prefix=/usr/local/stackless
скомпилировать и установить:
$ make
$ sudo make install
Вообще-то, наиболее правильным было бы инсталлировать stackless-python через систему ports, но он в ней почему-то отсутствует.
Теперь нам нужно скачать и распаковать virtualenv:
$ fetch \http://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.4.5.tar.gz
$ tar -xvzf virtualenv-1.4.5.tar.gz
после чего создать виртуальную «песочницу», в которой будет работать Nagare (/usr/local/nagare):
$ cd virtualenv-1.4.5
$ sudo /usr/local/stackless/bin/python ./virtualenv.py /usr/local/nagare
Теперь, нужно установить, собственно, сам Nagare:
sudo /usr/local/nagare/bin/easy_install 'nagare[full]'
Все, Nagare установлен и готов к работе.
Создадим приложение:
$ /usr/local/nagare/bin/nagare-admin create-app test1
Application 'test1' created.
Note:
1. Edit the file 'test1/setup.py' to set the informations about your new application.
2. Register your application with:
- cd "test1"
- "/usr/local/nagare/bin/python" setup.py develop
Будет создан каталог test1, содержащий следующие файлы:
./test1/setup.py
./test1/test1/__init__.py
./test1/test1/app.py
./test1/test1/models.py
./test1/static/__init__.py
./test1/data/__init__.py
./test1/conf/__init__.py
./test1/conf/test1.cfg
Файл setup.py содержит всякую служебную информацию типа лицензии, имени автора, его email и т.п., для тестового приложения можно его не заполнять, работать будет и так.
В файле conf/test1.cfg включим режим отладки и подключим БД (по умлочанию — sqlite). После исправлений он будет выглядеть так:
[application]
path = app test1
name = test1
debug = on
[database]
activated = on
uri = sqlite:///$here/../data/test1.db
metadata = test1.models:__metadata__
debug = on
Теперь выполним команду:
$ sudo /usr/local/nagare/bin/python ./setup.py develop
Все, приложение зарегистрировано, можно его протестировать:
$ /usr/local/nagare/bin/nagare-admin serve test1
Application 'app test1' registered as '/test1'
03/17/10 18:00:35 - serving on \http://127.0.0.1:8080
По умолчанию приложение будет доступно по адресу \http://127.0.0.1:8080/test1.
Приступим к разработке.
Сначала зададим таблицы базы данных. Для этого отредактируем файл test1/models.py, добавив определения таблиц (интересующихся подробностями отошлю к документации Elixir). В итоге, файл будет выглядеть так:
from elixir import *
from sqlalchemy import MetaData
__metadata__ = MetaData()
class GuestBookRecord(Entity):
text=Field(Unicode(1000))
name=Field(Unicode(50))
Создадим саму базу данных:
$ /usr/local/nagare/bin/nagare-admin create-db test1
2010-03-17 18:08:22,895 INFO sqlalchemy.engine.base.Engine.0x...ac6c PRAGMA table_info("test1_models_guestbookrecord")
2010-03-17 18:08:22,900 INFO sqlalchemy.engine.base.Engine.0x...ac6c ()
2010-03-17 18:08:22,934 INFO sqlalchemy.engine.base.Engine.0x...ac6c
CREATE TABLE test1_models_guestbookrecord (
id INTEGER NOT NULL,
text VARCHAR(1000),
name VARCHAR(50),
PRIMARY KEY (id)
)
2010-03-17 18:08:22,971 INFO sqlalchemy.engine.base.Engine.0x...ac6c ()
2010-03-17 18:08:22,982 INFO sqlalchemy.engine.base.Engine.0x...ac6c COMMIT
Теперь запрограммируем простейшую гостевую книгу. Для этого файл test1/app.py отредактируем следующим образом:
from __future__ import with_statement
import os
from nagare import presentation, var
# Импортируем структуру таблиц
from models import *
class Test1(object):
def __init__(self):
self.name=var.Var("") # В эти переменные будут помещаться значения полей формы
self.text=var.Var("") #
# Метод для добавления записи в БД
def add_rec(self):
nr=GuestBookRecord()
nr.name=self.name()
nr.text=self.text()
session.save(nr)
@presentation.render_for(Test1)
def render(self, h, *args):
# Заголовок
h<<h.h1("Guest book")
# Форма для имени и текста сообщения
with h.form:
with h.table:
with h.tr:
with h.td:
h<<"Name:"
with h.td:
h<<h.input(type="text", value=self.name()).action(lambda v: self.name(v))
with h.tr:
with h.td(valign="top"):
h<<"Text:"
with h.td:
with h.textarea().action(lambda v: self.text(v)):
pass
with h.tr:
with h.td(colspan=2):
h<<h.input(type="submit", value="Add").action(self.add_rec)
h<<h.hr
# Вывод ранее введенных сообщений:
with h.table:
recs=GuestBookRecord.query.all()
for r in recs:
with h.tr:
with h.td(valign="top", align="right"):
h<<h.b(r.name)<<":"
with h.td:
h<<r.text
return h.root
# ---------------------------------------------------------------
app = Test1
Запустив приложение командой:
$ /usr/local/nagare/bin/nagare-admin serve test1
По адресу \http://127.0.0.1:8080/test1 мы обнаружим премилую гостевую книгу, в стиле «привет из 90-х».
Приведенный выше пример не раскрывает и 10% возможностей Nagare и приведен только для примера. В следующий раз я покажу, как при помощи Nagare можно создавать более сложные приложения.