English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Шаблоны Flask

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 в браузере, чтобы получить следующий вывод.