Nevow - (potente) Web Framework

Buongiorno,

essendomi 'votato' per ora all'utilizzo e allo studio di nevow, tenterò di descrivere nei limiti delle mie attuali conoscenze Nevow, descrivendolo al meglio, specificando anche dove possibile delle piccole note magari inutili ma che a mio parere sono fondamentali per definirsi conoscitore di una tecnologia.

Nevow, che si pronuncia alla Francese "nouveau" che, riconoscendo il merito ad un mio amico che studia francese, si pronuncia nuvò ( non ho usato i caratteri per la fonetica, prendetela per buona  :) ). Nevow è progettato sull'architettura di Twisted.

Nell'installazione sarà quindi necessario avere Twisted prima di procedere ad installare Nevow. A sua volta Twisted richiede l'installazione di zope.interface che verrà usato nei moduli di twisted.
Per eseguire una applicazione Nevow, bisogna creare un'apposito file in estensione .tac ( Twisted Application Configuration ) in cui si specifica l'applicazione e altri dettagli tra cui il server e la porta su cui opera il server, che in questo caso sarà 8080. Quindi una volta generato i file della applicazione e il file.tac bisogna lanciare l'applicazione sul server col comando :
twistd -noy nomefile.tac

Di seguito mostro un file di configurazione preso dalla documentazione di Nevow e su questa seguirà un mio personale appunto, seppur esula dai miei intenti essere soggettivo in questa mia esposizione di conoscenza :

from twisted.application import internet
from twisted.application import service
from nevow import appserver
import helloworld

application = service.Application('helloworld')
site = appserver.NevowSite(helloworld.HelloWorld())
webServer = internet.TCPServer(8080, site)
webServer.setServiceParent(application)

Sarà passato del tempo e non sò come era un tempo, ma al tempo attuale ritengo veramente ben  sviluppata la documentazione di Nevow e trovo decine e decine di esempi completati da commenti e motivazioni, con tanto di esempi 'sporchi' e ottimizzati, e il tutto sul sito divmod.org nella sezione dedicata a Nevow.

Lanciata la nostra applicazione, bisognerà aprire il browser e farlo puntare sull'indirizzo http://localhost:8080
e potremo vedere all'opera la nostra creazione ( o in caso di apprendimento, molto probabilmente un esempio scritto da altri ).

Con il download di Newov da svn ( opero in ambiente linux ) troviamo anche una cartella 'examples' di cui è possibile aprire il file della homepage in html che ci dirà ancora una volta che il comando per far partire un file su twisted è :
twistd -noy nomefile.tac
e nello specifico, bisogna selezionare il file (dalla cartella degli esempi) examples.tac che ci restituirà in output l'avvio del web server.

Gli esempi non mancano, sono ben specificate anche tutte le funzionalità di Nevow con esempi a dir poco straordinari tanto che mi hanno convinto ad imparare a usare Nevow (piccola nota personale :)).

Nevow permette una vasta gamma di operazioni per produrre del codice che rispetti gli standard.
Principalmente e molto, molto superficialmente parlando permette di includere un file template esterno nel file ed effettuare l'elaborazione dei dati dinamicamente (es. stampare x numeri random da 0 a n ), un semplice esempio segue :

from nevow import loaders, rend
class HelloWorld(rend.Page):
addSlash = True
docFactory = loaders.xmlfile('helloworld.html')

Commentando il semplicissimo esempio di sopra, importiamo nevow.loaders che contiene due dei più utlizzati metodi per produrre output ovvero stan e xmlfile. In questo esempio vediamo l'utilizzo di xmlfile che ci consente di caricare un file template esterno.
Il metodo addSlash se dichiarato a true permette di inserire uno slash in fondo all'url specificato, pertanto www.examples.com/file_o_directory diverrà -> www.examples.com/file_o_directory/ .

Un'ultima nota sul metodo xmlfile è che permette di caricare qualsiasi file xml ben formato.
Affinchè sia possibile far riconoscere il template a nevow bisogna includere la dichiarazione xmlns:nevow="http://nevow.com/ns/nevow/0.1, mi documenterò in seguito in merito ad un'eventuale cambio di questo url o in merito alla stessa dichiarazione e vi farò sapere :).

Passiamo Stan, un'altro modo di produrre xml scrivendo puro python, premettendo prima che stan non è richiesto per l'utilizzo di nevow ma è un potente metodo per creare output XHTML ben formato e valido (rispetto dei tag di chiusura e altre direttive di cui rimando la visione al w3c) :

import random
from nevow import rend, tags

class Greeter(rend.Page):
def greet(self, context, data):
return random.choice(["Hello", "Greetings", "Hi"]), " ", data

docFactory = loaders.stan(tags.html[\
tags.head[tags.title[ "Greetings!" ]],\
tags.body[tags.h1(style="font-size: large")[ "Now I will greet you:" ],greet]])

Come possiamo vedere nel codice (non spiegherò altro che stan) caricato stan viene dichiarato vengono dichiarati i tag che in ouput saranno presentati in codice xhtml. Avendo fatto in prima persona i vari test, posso anche affermare che l'unico svantaggio dell'utilizzo di stan, che non risiede nelle prestazioni o simil, è da ritrovare nella formattazione del sorgente della pagina html, infatti avremo il codice disposto come nell'esempio che segue :

<html><head><title>Hello</title></head><body><p id="body">Welcome to the wonderful world of Nevow!</p></body></html>

Anzichè avere una formattazione che può offrire un template da noi scritto e caricato tramite l'utilizzo di xmlfile :

<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <p id="body">Welcome to the wonderful world of Nevow!</p>
  </body>
</html>

Nevow mette a disposizione anche vari metodi per controllare efficacemente ciò che si riceve in input da una pagina.
Questa proprietà è da ricercare in Formless, che ci permette di descrivere in python ciò che può essere passato in input in una determinata zona del nostro form, secondo la guida questa è la via più semplice per fare ciò.
In caso di errore si ritorna al form con l'aggiunta dell'output dell'errore commesso. (es. in un form che deve ricevere un intero, viene inserita una stringa, si ritorna alla pagina con il relativo errore).

Di seguito un semplice esempio preso dalla documentazione di Nevow :

from zope.interface import implements
from formless.annotate import TypedInterface, Integer, String

class ISimpleMethod(TypedInterface):
def simple(self, name=String(description="Your name."),age=Integer(description="Your age.")):
"""Simple
Please enter your name and age.
"""

class Implementation(object):
implements(ISimpleMethod)

def simple(self, name, age):
print "Hello, %s, who is %s" % (name, age)

Abbiamo poi Webform che è null'altro che un modulo che processa automaticamente il form, ed il procedimento è quasi automatizzato in congiunzione a twisted.web.

Abbiamo inolte, Livepage che permette interazioni server-side e client-side senza richiedere il caricamento della pagina.
Il secondo modo per fare ciò è utilizzare Athena di cui ancora non sono riuscito a trattare nulla, ma appena avrò una cognizione anche su questa vedrò di parlarne.

Spero di aver chiarito in qualche modo quello che è Nevow,

per ulteriori e dettagliate guide/esempi vi rimando al sito divmod.org, dal quale basterà selezionare tra i framework 'Nevow' per ritrovarsi qui http://divmod.org/trac/wiki/DivmodNevow, inoltre specificando quanto dicono le stesse guide di Nevow, si cerca di realizzare guide complete, ma per maggiori dettagi su zope.interface o twisted bisogna fare riferimento alle guide dei rispettivi progetti.

Per scaricare le versioni già 'riviste' e corrette in eventuali errori di esempi e sorgenti, è possibile utilizzare :
svn co http://divmod.org/svn/Divmod/trunk/Nevow/ Nevow

altrimenti :
http://divmod.org/trac/attachment/wiki/SoftwareReleases/Nevow-0.9.31.tar.gz?format=raw

Però attenzione, con il passare del tempo,  le release vengono migliorate e vengono rilasciate nuove versioni, quindi è sempre meglio controllare la presenza di una nuova versione nella pagina principale di Nevow, altrimenti si rischia di utilizzare versioni non più consigliate.

Grazie a tutti, buona giornata.