Учебники

Колба — Шаблоны

Можно вернуть выходные данные функции, связанной с определенным URL, в форме HTML. Например, в следующем скрипте функция hello () отобразит «Hello World» с прикрепленным к нему тегом <h1> .

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)

Однако генерирование HTML-контента из кода Python является обременительным, особенно когда необходимо поместить переменные данные и такие элементы языка Python, как условные выражения или циклы. Это потребует частого выхода из HTML.

Здесь можно воспользоваться механизмом шаблонов Jinja2 , на котором основан Flask. Вместо того, чтобы возвращать HTML-код из функции, HTML-файл может быть обработан функцией 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 попытается найти файл HTML в папке с шаблонами, в той же папке, где находится этот скрипт.

  • Папка приложения
    • Hello.py
    • шаблоны
      • hello.html

Термин «система веб-шаблонов» относится к разработке HTML-скрипта, в который можно динамически вставлять переменные данные. Система веб-шаблонов включает в себя механизм шаблонов, некоторый источник данных и процессор шаблонов.

Flask использует шаблонизатор jinga2 . Веб-шаблон содержит HTML-синтаксис с вкраплениями заполнителей для переменных и выражений (в данном случае выражений Python), которые заменяются значениями при визуализации шаблона.

Следующий код сохраняется как hello.html в папке шаблонов.

<!doctype html>
<html>
   <body>
   
      <h1>Hello {{ name }}!</h1>
      
   </body>
</html>

Затем запустите следующий скрипт из оболочки 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)

Когда сервер разработки начнет работать, откройте браузер и введите URL-адрес как — http: // localhost: 5000 / hello / mvl

Переменная часть URL вставляется в {{name}} место.

Пример системы веб-шаблонов

Шаблонный движок Jinga2 использует следующие разделители для выхода из HTML.

  • {% …%} для заявлений
  • {{…}} для выражений для печати в выходные данные шаблона
  • {# … #} для комментариев, не включенных в вывод шаблона
  • # … ## для линейных операторов

В следующем примере демонстрируется использование условного оператора в шаблоне. Правило URL для функции hello () принимает целочисленный параметр. Он передается в шаблон hello.html . Внутри сравнивается значение полученного числа (оценки) (больше или меньше 50) и, соответственно, условно отображается HTML.

Сценарий Python выглядит следующим образом —

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)

Сценарий HTML-шаблона hello.html выглядит следующим образом:

<!doctype html>
<html>
   <body>
      {% if marks>50 %}
         <h1> Your result is pass!</h1>
      {% else %}
         <h1>Your result is fail</h1>
      {% endif %}
   </body>
</html>

Обратите внимание, что условные операторы if-else и endif заключены в разделитель {% ..%} .

Запустите скрипт Python и посетите URL http: // localhost / hello / 60, а затем http: // localhost / hello / 30, чтобы увидеть, как вывод HTML изменяется условно.

Конструкции цикла Python также могут использоваться внутри шаблона. В следующем сценарии функция result () отправляет объект словаря в шаблон results.html при открытии в браузере URL http: // localhost: 5000 / result .

Часть Template файла result.html использует цикл for для рендеринга пар ключ-значение объекта словаря result {} в виде ячеек таблицы HTML.

Запустите следующий код из оболочки 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)

Сохраните следующий HTML-скрипт как result.html в папке шаблонов.

<!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>

Здесь снова операторы Python, соответствующие циклу For , заключены в {% ..%}, тогда как ключ и значение выражений находятся внутри {{}} .

После запуска разработки откройте в браузере http: // localhost: 5000 / result, чтобы получить следующий вывод.