Можно вернуть выходные данные функции, связанной с определенным 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, чтобы получить следующий вывод.