quixote(parte5)

Anche nel file due.ptl all interno della classe dirc()  possiamo richiamare la form

scriveremo  supponendo che form è attributo di una classe Directory()

form = crea_form()

Adesso definiamo la funzione crea_form()

In genere la form in Quixote viene disegnata in queste linee:

1) Una parte  del codice crea i widget che faranno parte della form.

2) Poi una funzione ‘render()’ che mette in output html i widget creati sopra e che completano la form.

3) Una parte di codice che effettua i controlli per trovare eventuali errori.In tal caso  richiama render() punto2.Cioè

ridisegna la form iniziale.

4) Il return ad una funzione che mette in output il risultato finale della form processata ,nel caso non ci siano errori.

La sequenza funziona cosi: Essendo i punti 2 e 4 funzioni , esse devono essere chiamate per eseguire operazioni su dati,

quindi la funzione crea_form esegue codice dall alto al basso: Crea i widget [1],fa controlli,tra cui essendocci una condizione

comune negli script che controllano le form ,(se la form ha errori || non è stata inviata) prosegue a leggere il codice sotto,

altrimenti chiama render()[3]Il codice sotto alla fine della funzione un return all output del risultato.

from quixote.form import *
from miocss import FORM_CSS
from quixote import *

from quixote.errors import *

from quixote.html import  htmltext  #—per l ERROR_NOTICE—–


crea_form():

“””

L  oggetto di tipo Form acetta diversi parametri.

  • method =  Get o Post (default)
  • action   = url dove processare i dati  (none)
  • enctype  = quando dobbiamo inviare file binari (none)
  • use_token = (True) Questo funziona solo nel caso che in config.py abbiamo settato

a true il parametro  FORM_TOKENS che di default è disabilitato.Esso serve nel

caso vogliamo pèroteggere la form da attacchi di tipo (CSRF) cross-site attack

e dal doppio invio dei dati.

  • **attrs   =   significa che inoltre accetta lista di coppie chiave,valore .Una lista di tuple  ad es.

[(chiave,valore),(chaive1,valore1)]  tra cui (‘class’,’nome-classe’) che comunque consiglio

di lasciare vuoto ed usare cosi la classe di css di default essendo questa molto funzionale.

Possiamo copiare il modulo python css.py nella nostra applicazione ed importare il nome

come nell esempio il nome FORM_CSS.

Aggiungiamo i componenti con il metodo add.() che accetta :

  • il tipo di widget (obbligatorio)
  • il nome del widget (obbligatorio)

Inoltre sia tupla  che lista di tuple  per tutti gli atributi  html dei componenti di una form

e,inoltre ;

  • hint = una sorta di sottotitolo alla base del widget.
  • required = interessante perchè richiede l obbligatorietà del componente.

Quixote oltre ad avere i componenti classici delle form html ci mette a disposizione anche tanti

widget personalizzati che in HTML non esistono come  ad esempio:

NumberWidget .Sappiamo che HTML nei campi input possiamo inserire anche numeri ,ma

essi saranno interpretati sempre come stringhe,sta poi a  noi , che se stiamo lavorando con un

linguaggio debolmente tipizzato tipo PHP ,allora non accade nulla ,dato che possiamo trattare i numeri come stringhe

e viceversa.Ma se staiamo lavorando con un linguaggio fortemente tipizzato ma dinamicamente ,allora

dobbiamo stare attenti a fare un cast di tipo per trattare l input come un numero.

Quixote ci semplifica il lavoro mettendoci a disposizione appunto oltre al widget NumberWidget

anche FloatWidget , IntWidget .

Possiamo sperimentarne le varie opportunità dal file widget.py di Quixote.

“””

# I 2 attributi subito sotto servono per la personalizzazione degli errori

#Infatti oltre ai controlli base possiamo farne di nuovi (guardare sotto)

MENO_DI_6=’la password deve essere composta di almeno 6 caratteri’
C_NO=’il carattere @ non e ammesso’

form = Form()
form.add(StringWidget, “name”, title=”input stringa nome”,hint=’sottotitolo widget’,size=20, required=True)
form.add(PasswordWidget, “password”, title=”Password”,size=20, maxlength=20, required=True)
form.add_string(“stringa”,title=”campo di testo add_string”, hint = “metodo add_string”)

form.add_submit(“submit”, “Invia!”, id=’sb’)#id e il selettore di css
form.add_reset(“reset”,”reset”)

#ERROR_NOTICE è un altro attributo della classe form. che sotto ho riscritto in italiano.

#Esso viene richiamato in caso di errori qualsiasi nella form


form.ERROR_NOTICE= htmltext(‘<div>’
‘Ci sono stati degli errori durante il render della form.  ‘
‘Guarda sotto per i dettagli!.’
‘</div>’)

#Lo stesso per TOKEN_NOTICE nel caso attiviamo il controllo dei TOKEN per la form


form.TOKEN_NOTICE = htmltext(‘<div>’
‘la form inviata non  valida.   ‘
‘probabilmente i dati sono stati gia inviati  ‘
‘una volta con successo.  Per favore rivedere i dati ‘
‘e reinviarli di nuovo se occorre.’
‘</div>’)

# Il render() sotto mette la form in output html pronta per essere compilata

#Insomma la form allo stato iniziale

def render [html] ():


“””
<html>
<head><title>Form mia</title>
<style type=”text/css”>
%s
</style>
</head>
<body>
<h1>form esempio</h1>

“”” % FORM_CSS


form.render()   # QUESTO A FIANCO RICHIAMA LA FORM COSTRUITA SOPRA ####################

“””

</body>
</html>
“””

# Sotto iniziamo i controlli  ,se la form non è inviata oppure abbiamo errori

if not form.is_submitted() or form.has_errors():


return render()  # ritorna la form vuota ,da inviare


# Se il campo password è minore di 6 il metodo get() ritorna il value del widget


if len(form.get(‘password’)) < 6:  #——controllo lunghezza password

# set_error(widget,stringa errore) ci permette di personalizzare gli errori
form.set_error(‘password’,MENO_DI_6)


return render()


# Sotto ancore,se il primo campo input contiene il carattere @


for x in form.get(‘name’):  #——cicliamo i caratteri del value della widget


if x == ‘@':            # se incontriamo il carattere  @


form.set_error(‘name’,C_NO) # ritorniamo l errore particolare al widget con la stringa contenuta in C_NO


return render()                   # Ed andiamo a ricompilare


#Ancora se come stringa nel primo campo input inseriamo ‘ecc’
#In questo caso ridefiniamo proprio la classe  RequestError() in error.py.

#Non è certo il metodo piu adatto ,ma comunque lo faccio vedere per capirne il funzionamento.

#Cosi ritorniamo una pagina di errore di cui possiamo definire il titolo ed il corpo


if form.get(‘name’) == ‘ecc': # se inseriamo ‘ecc’ al primo input


xx=RequestError()       # creiamo un oggetto  ne definiamo le proprietà
xx.title=’ridefinizione errore’
xx.description=“””test per riscrivere e sollevare una requesterror
nel file errors.py ci sono diversi errori
che si possono ridefinire
“””

return format_publish_error(xx)  # e lo pubblichiamo in una pagina html

#success funzione template PTL ci da in output i risultato della form dopo i controlli.Il risultato finale.

def success [html] ():


“””
<html>
<head><title>dati  form values</title></head>
<body>
<h2>Form data:</h2>
<table>
<tr>
<th align=left>Name</th>
<th align=left>Type</th>
<th align=left>Value</th>
</tr>
“””


for widget in form.get_all_widgets():#qui tramite un ciclo si costruisce una tabella


value = widget.parse() #valore di ogni widget della form
‘<tr>’
‘  <td> widget   name %s</td>’ % widget.get_name() # nome di ogni widget
‘  <td> widget type %s</td>’ % getattr(value, str(‘__class__’),type(value)).__name__  #qui il type della widget
‘<td>’


if value is None:            # se il valore è None———-


“<i>None</i>”


elif isinstance(widget, FileWidget): # questo nel caso abbiamo il widget di tipo file—————–


repr(value)
‘ (%s bytes)’ % len(value.fp.read()) # il value del file viene restituito in byte————–


else:


value                #Qui diamo in output il value dei widget della form———-


‘</td>’
‘</tr>’
‘</br>’


# questo sotto invece restituisce  il valore di un widget singolarmente (di nome ‘name’)———
widget_value =  get_request().get_field(‘name’) #Il value attraverso il metodo dell oggetto request()——-
# Ancora sotto il type del widget di cui abbiamo il ‘name’
# sono questi ultimi modi piu immediati di prendere le prorieta dei widget rispetto al ciclo sopra

widget_n = form.get_widget(‘name’) # Il type appunto——-
u'<br /><b style=color:#c00;  >questo è il widget  -> %s e valore ->  %s  </b>’ % (widget_n,widget_value)

“””
</table>
</body>
</html>
“””
#——————fine output  dei dati della form ——————————

# Che appunto richiamiamo se è tutto ok nei controlli vari ——————
return success()

Parte6

Leave a Reply

Your email address will not be published.


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>