English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Flask может возвращать вывод функции, привязанной к URL, в виде HTML. Например, в следующем скрипте функция hello() будет представлена с помощью дополнительных тегов <h1>. ‘Hello World’ .
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 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, не требуя возвращать硬кодированный HTML из функции. Как показано в следующем коде, можно渲染 файл HTML с помощью функции render_template().
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 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 в папке templates, находящейся в той же папке, что и этот скрипт. Структура каталога приложения, использующего шаблоны, выглядит следующим образом -
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 app.py hello.py templates hello.html register.html ....
Термин «система веб-шаблонов» означает разработку HTML-скрипта, в котором можно динамически вставлять данные переменных. Система веб-шаблонов состоит из шаблонного движка, источника данных и обработчика шаблонов.
Flask использует шаблонный движок jinga2. Веб-шаблон содержит HTML-синтаксис для вставки переменных и выражений (в данном случае Python-выражений), которые при呈现 шаблона заменяются значениями.
Следующий код в шаблоне( templates)в папке, сохраните как: hello.html.
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Обработка HTTP-запросов Flask</title> </head> <body> <h1>Hello {{ name }}!</h1> </body> </html>
Далее, сохраните следующий код в app.pyв файле и запустите его из Python shell -
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 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/maxsu
Переменная часть URL вставляется в место占位ника {{name}}.
Jinja2-мотор шаблонов использует следующие разделители для escaping из HTML.
{% ... %} Используется для многострочных выражений {{ ... }} Используется для вывода выражений в шаблон {# ... #} Используется для комментариев, не включенных в вывод шаблона # ... ## Используется для однolinейных выражений
В следующем примере показано использование условных операторов в шаблоне. Регулярное выражение URL функции hello() принимает целочисленный параметр. Он передается шаблону hello.html. Внутри него сравнивается значение полученного числа (балла) с 50, поэтому в HTML выполняется условное рендеринг вывода.
Python-скрипт следующий -
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 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)
Файл шаблона: hello.html Шаблон HTML-скрипта следующий -
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Пример шаблона Flask</title> </head> <body> {% if marks > 50 %} <h1>Прошли экзамен!</h1> {% else %} <h1>Не прошли экзамен!</h1> {% endif %} </body> </html>
Обратите внимание, что условия if-else и endif включены в разделители {%..%.}
Запустите Python-скрипт и откройте URL => http://localhost/hello/60, затем откройте http://localhost/hello/59, чтобы условно просмотреть вывод HTML.
Структура цикла Python также может использоваться в шаблоне. В следующем скрипте, когда URL => http://localhost:5000/result открывается в браузере, функция result() отправляет объект словаря в файл шаблона: results.html .
result.html Часть шаблона использует цикл for, чтобы представить ключи и значения объекта словаря result{} в виде ячеек таблицы HTML.
Запустите следующий код в Python shell.
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 from flask import Flask, render_template app = Flask(__name__) @app.route('/result') def result(): dict = {'phy': 59, 'che': 60, 'maths': 90} return render_template('result.html', result = dict) if __name__ == '__main__': app.run(debug=True)
Сохраните следующий HTML-скрипт в папку шаблонов ( templates) файла шаблона: result.html .
# Filename: example.py # Copyright: 2020 By w3codebox # Author by: ru.oldtoolbag.com # Date: 2020-08-08 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Пример шаблона Flask</title> </head> <body> <table border="1"> {% for key, value in result.items() %} <tr> <th> {{ key }} </th> <td> {{ value }} </td> </tr> {% endfor %} </table> </body> </html>
Здесь, Python-выражение, соответствующее циклу for, содержится в {%...%}, а ключ и значение выражения放在 {{}}.
После запуска разработки откройте http://localhost:5000/result в браузере, чтобы получить следующий вывод.