Простое 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')
На данном этапе можно прийти к двум неутешительным выводам:
- Если на сайте много страниц, то в программе будет множество похожих функций.
- Нtml-файлы содержат много идентичного кода. В результате непонятна выгода от использования фреймворка по-сравнению с сайтом, состоящем только из статичных html-страниц.
Flask решает обе проблемы. Как именно, узнаем в следующих уроках.