Pull to refresh

Nagare — пример использования фреймворка

Reading time 4 min
Views 1.1K
В прошлом посте я презентовал Nagare — революционный (хоть и имеющий аналоги на Smalltalk и CL) питоновский web-фреймворк. Тот пост был несколько сумбурен и отражал, скорее, степень моего восторга, чем реальные особенности технологии. Сегодня я попробую дать немного более практический пример.

Начнем сначала. Прежде всего, нам потребуется 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 можно создавать более сложные приложения.
Tags:
Hubs:
+14
Comments 42
Comments Comments 42

Articles