Thursday 24 January 2019

Templates in Flask

È possibile restituire l'output di una funzione associata a un determinato URL sotto forma di HTML. Ad esempio, nel seguente script, la funzione hello () renderizza 'Hello World' con il tag <h1> collegato ad esso.
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
   return '<html><body><h1>'Hello World'</h1></body></html>'

if __name__ == '__main__':
   app.run(debug = True)
Tuttavia, la generazione di contenuti HTML dal codice Python è complicata, specialmente quando è necessario inserire dati variabili e elementi di linguaggio Python come condizionali o loop. Ciò richiederebbe frequenti fughe dall'HTML.
È qui che è possibile sfruttare il motore di template Jinja2 , su cui è basato Flask. Invece di restituire codice HTML hardcode dalla funzione, un file HTML può essere reso dalla funzione render_template () .
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
   return render_template(‘hello.html’)

if __name__ == '__main__':
   app.run(debug = True)
Flask proverà a trovare il file HTML nella cartella dei modelli, nella stessa cartella in cui è presente questo script.
  • Cartella dell'applicazione
    • Hello.py
    • modelli
      • hello.html
Il termine 'web templating system' si riferisce alla progettazione di uno script HTML in cui i dati variabili possono essere inseriti dinamicamente. Un sistema di modelli Web comprende un motore di template, una sorta di fonte di dati e un processore di template.
Flask utilizza il motore di template jinga2 . Un modello Web contiene segnaposto intervallati della sintassi HTML per variabili ed espressioni (in questo caso espressioni Python) che vengono sostituiti quando viene eseguito il rendering del modello.
Il seguente codice viene salvato come ciao.html nella cartella dei modelli.
<!doctype html>
<html>
   <body>
   
      <h1>Hello {{ name }}!</h1>
      
   </body>
</html>
Successivamente, esegui il seguente script dalla shell Python.
from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello/<user>')
def hello_name(user):
   return render_template('hello.html', name = user)

if __name__ == '__main__':
   app.run(debug = True)
All'avvio del server di sviluppo, aprire il browser e inserire l'URL come - http: // localhost: 5000 / hello / mvl
La parte variabile dell'URL è inserita in {{name}} segnaposto.
Esempio di sistema di web templating Il motore di template Jinga2 utilizza i seguenti delimitatori per l'escape dall'HTML.
  • {% ...%} per le dichiarazioni
  • {{...}} per le espressioni da stampare sull'output del modello
  • {# ... #} per i commenti non inclusi nell'output del modello
  • # ... ## per Line Statement
Nell'esempio seguente, viene illustrato l'uso dell'istruzione condizionale nel modello. La regola URL della funzione hello () accetta il parametro intero. Viene passato al modello hello.html . Al suo interno, il valore del numero ricevuto (segni) viene confrontato (maggiore o minore di 50) e, di conseguenza, HTML viene reso condizionalmente.
Lo script Python è il seguente -
from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello/<int:score>')
def hello_name(score):
   return render_template('hello.html', marks = score)

if __name__ == '__main__':
   app.run(debug = True)
Lo script del modello HTML di hello.html è il seguente:
<!doctype html>
<html>
   <body>
      {% if marks>50 %}
         <h1> Your result is pass!</h1>
      {% else %}
         <h1>Your result is fail</h1>
      {% endif %}
   </body>
</html>
Si noti che le istruzioni condizionali if-else e endif sono racchiuse nel delimitatore {% ..%} .
Esegui lo script Python e visita l'URL http: // localhost / hello / 60 e poi http: // localhost / hello / 30 per vedere l'output di HTML che cambia condizionatamente.
I costrutti di loop Python possono anche essere utilizzati all'interno del modello. Nel seguente script, la funzione result () invia un oggetto dizionario al modello results.html quando URL http: // localhost: 5000 / result viene aperto nel browser.
La parte Template di result.html utilizza un ciclo for per il rendering di coppie chiave e valore di oggetto dizionario risultato {} come celle di una tabella HTML.
Esegui il seguente codice dalla shell Python.
from flask import Flask, render_template
app = Flask(__name__)

@app.route('/result')
def result():
   dict = {'phy':50,'che':60,'maths':70}
   return render_template('result.html', result = dict)

if __name__ == '__main__':
   app.run(debug = True)
Salva il seguente script HTML come risultato.html nella cartella dei modelli.
<!doctype html>
<html>
   <body>
      <table border = 1>
         {% for key, value in result.iteritems() %}
            <tr>
               <th> {{ key }} </th>
               <td> {{ value }} </td>
            </tr>
         {% endfor %}
      </table>
   </body>
</html>
Qui, ancora una volta le istruzioni Python corrispondenti al ciclo For sono racchiuse in {% ..%} mentre la chiave e il valore delle espressioni sono inseriti in {{}} .
Dopo aver avviato lo sviluppo, apri http: // localhost: 5000 / risultato nel browser per ottenere il seguente output.
Esempio di modello di tabella

No comments:

Post a Comment