Простое flask-приложение. Функция render_template

Предварительно требуется установить фреймворк Flask и знать, как запустить flask-приложение (сайт, создаваемый на Flask).

Главный файл flask-приложения

Поскольку Flask ‒ это фреймворк языка Python, очевидно, основной файл нашего приложения будет написан на Python и иметь расширение .py. Когда этот файл запустится на исполнение, сайт "поднимется" и начнет работать (хотя не так все просто, для отображения страниц сайта в браузере необходим также веб-сервер, под которым здесь и далее понимается соответствующий софт, а не "железо").

Рассмотрим минимальное flask-приложение:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World'

Здесь из модуля flask импортируется класс Flask. (Не путайте с названием самого фреймворка.)

От него создается экземпляр и присваивается переменной, которую часто называют app, но имя может быть любым.

Далее создается функция index (имя также произвольно), которая просто возвращает строку. Не просто в ней то, что она оформляется декоратором. В нем app ‒ это переменная, связанная с экземпляром Flask. После точки route('/') означает маршрут ‒ путь, обращение к которому приведет к вызову данной функции. То, что она вернет, будет отдано веб-серверу, который передаст это веб-клиету (на компьютер и в браузер пользователя).

Еще раз с общих чертах опишем происходящее. Человек вводит в браузере URL, состоящий из протокола передачи данных (в данном случае http или https), через двоеточие и двойной слэш доменного имени или IP-адреса (возможно с портом), после которого через слэш идет оставшаяся часть адреса.

(Примечание: Адрес без протокола и доменного имени будем называть "путь". Часто, но не всегда, он будет совпадать с адресацией файлов и каталогов в пределах нашего проекта.)

Браузер обращается к указанному серверу сразу по IP или предварительно получив его через систему DNS по имени домена. Браузер передает серверу URL-адрес. Программный веб-сервер передает путь flask-приложению. Оно ищет соответствующий этому пути декоратор и выполняет связанную с ним функцию-представление (такие называют views). Функция возвращает строку. Приложение отдает ее веб-серверу. Веб-сервер формирует ответ и посылает его клиенту.

Программный код, который все это реализует, пишется не нами. Он находится в браузере, веб-сервере, фреймворке Flask. Мы лишь пользуемся ими "выставленными наружу интерфейсами" ‒ API ‒ своего рода кнопками управления.

А вот каким будет наш сайт, какие страницы содержать, какова будет логика обработки клиентских запросов, определим мы, написав программу с использованием модуля flask.

В программе выше адрес '/' означает главную страницу сайта. То есть, когда в адресной строке есть только имя домена или IP-адрес (с портом или без) сервера.

Функция render_template и html-файл

Одной из основных задач web-браузера является интерпретация html-кода, полученного от сервера, и показ в окне результата в удобной для восприятия человеком форме. Следовательно, наше flask-приложение должно отдавать серверу html-код (пусть и зашитый в строку), а не просто какую-то строку.

Изменим функцию index следующим образом:

@app.route("/")
def index():
    return """
<!DOCTYPE html>
<html lang="ru">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,
                          initial-scale=1">
    <title>Главная страница | Основы биологии</title>
  </head>
  <body>
    <h1>О сайте "Основы биологии"</h1>
    <p>Описание в разработке</p>
  </body>
</html>
"""

Обновив страницу в браузере, мы увидим изменения.

Коду HTML в главном файле приложения не место, иначе не будет речи об эффективной разработке и удобстве обслуживания сайта в дальнейшем. Во flask должен быть способ обращения к html-файлу. Данную роль выполняет функция render_template.

Перед ее использованием выполним подготовительные действия: создадим в каталоге проекта подкаталог templates (обязательно с таким именем), в нем ‒ html-файл с любым именем, например, base.html. Перенесем в этот файл html-код.

После этого исправим главный файл:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('base.html')

Здесь помимо класса Flask, импортируется функция render_template, которая затем вызывается в теле функции index.

В качестве аргумента render_template() получает имя html-файла. По-умолчанию файл ищется в каталоге templates. Представим, что функция открывает файл, считывает из него данные, преобразует их в единую строку и отдает оператору return.

Пусть на нашем сайте будет еще одна страница. Скопируем файл base.html, копию назовем plants.html. Изменим в этом файле содержимое элементов h1 и p. Например, "Растения" и "Общая характеристика растений".

Пусть страница будет открываться в браузере по URL http://127.0.0.1:5000/plants. Для этого добавим в py-файл еще одну функцию.

@app.route('/plants')
def page():
    return render_template('plants.html')

На данном этапе можно прийти к двум неутешительным выводам:

Flask решает обе проблемы. Как именно, узнаем в следующих уроках.

Разработка на Flask сайта без базы данных

На этой странице