The version 0.3.0 of the Nagare web framework is now released !
To read about its features: http://www.nagare.org/trac/wiki/NagareFeatures
Release info and download page: http://pypi.python.org/pypi/nagare
Release info and download page of the examples: http://pypi.python.org/pypi/nagare.examples
Source and documentation available at the website: http://www.nagare.org
Mailing lists - the place to ask questions: http://groups.google.com/group/nagare-users
About Nagare ============
Nagare is a components based framework: a Nagare application is a composition of interacting components each one with its own state and workflow kept on the server. Each component can have one or several views that are composed to generate the final web page. This enables the developers to reuse or write highly reusable components easily and quickly.
Thanks to Stackless Python, Nagare is also a continuation-based web framework which enables to code a web application like a desktop application, with no need to split its control flow in a multitude of controllers and with the automatic handling of the back, fork and refresh actions from the browser.
Its component model and use of the continuation come from the famous Seaside Smalltalk framework.
Furthermore Nagare integrates the best tools and standard from the Python world. For example:
A complete "guess a number" game to taste how easy web coding becomes using continuations:
import random from nagare import component, util
class Number(component.Task): """A little game to guess a number """ def go(self, comp): """The game algorithm, using continuation for a pure linear Python code In: - ``comp`` -- this component """ self.attempt = 1 number = random.randint(1, 20) comp.call(util.Confirm('I choose a number between 1 and 20. Try to guess it')) while True: x = comp.call(util.Ask('Try #%d: ' % self.attempt)) if not x.isdigit(): continue x = int(x) if x > number: comp.call(util.Confirm('Choose a lower number')) if x < number: comp.call(util.Confirm('Choose a greater number')) if x == number: comp.call(util.Confirm('You guessed the number in %d attempts' % self.attempt)) break
self.attempt += 1
A simple todo list, illustrating the programmatic HTML generation, the association of view(s) to Python objects and the direct association of callbacks to HTML form elements and links:
from nagare import presentation from nagare.namespaces import xhtml
# A plain Python ``TodoList`` class class TodoList(object): def __init__(self): self.todo = 
def add_todo(self, msg): self.todo.append(msg)
# The default HTML view, generated in programmatic HTML @presentation.render_for(TodoList) def render(self, h, comp, model): # ``h`` is a (X)HTML renderer (http://www.nagare.org/trac/wiki/RendererObjects) with h.div: for msg in self.todo: h << h.blockquote(msg) << h.hr
with h.form: h << 'New todo:' << h.br h << h.textarea.action(self.add_todo) << h.br h << h.input(type='submit', value='Add')
0.3.0 Changelog ===============
New features ------------
- refactoring of the sessions managers:
- session objects now keep track of their sessions manager - no more sessions manager factories - configurable pickler / unpickler objects - configuration switch ``states_history`` to set if an objects graphs history must be kept - new sessions manager (``type=memory``) that keeps the objects graphs in memory, without any pickling - logging service added:
- Stackless Python 2.6.4 is now the recommanded Python version - virtualenv updated to 1.4.5 - SQLAlchemy updated to 0.5.8 - Elixir updated to 0.7.1 - Lxml updated to 2.2.4 - YUI updated to 2.8.0r4
- with the YUI connection manager, a large browser response must be reassembled (Firefox only) - late creation of the SQLAlchemy database engines and metadatas binding - input fields ot type ``button`` now working in an Ajax submit - ``Var.var()`` now working inn a unicode context - ``nagare-admin create-rules`` had problems when a static directory didn't exist - bad boolean expressions parenthesis translation in pyjs fixed - parsing (X)HTML from URL now working under Windows
Bugs fixed ----------
- #47: ``set_publisher()`` called when using "nagare-admin create-db" - #48: py2js parentheses bug - #49: ``reset`` configuration ignored by the memcached sessions manager - #50: [log] inferred caller is wrong