Установка Flask и запуск flask-приложения на локальном компьютере
Пакет flask рекомендуют устанавливать в виртуальной среде (виртуальном окружении) Python. Понятно, это не является обязательным условием. Flask может быть установлен непосредственно в систему командой pip3 install Flask
или pip install Flask
(в дистрибутивах Linux вероятно потребуется sudo
перед pip
).
Также возможна установка с помощью менеджера пакетов самой операционной системы. В Ubuntu команда выглядит так: sudo apt install python3-flask
.
Проверить наличие соответствующих модулей и узнать их версию можно командами (в Ubuntu):
python3 -m flask --version python3 -m pip --version
При отсутствии pip
, если вы хотите установить его, в Ubuntu это можно сделать командой sudo apt install python3-pip
.
Кратко узнать общую информацию о pip
, модуле venv
и зачем создают виртуальную среду, можно в статье "Установщик пакетов и виртуальное окружение в Python".
Установка виртуального окружения и пакета flask в каталог сайта на локальном компьютере
Сначала надо создать каталог с произвольным именем, в котором будут размещаться файлы сайта-приложения, и перейти в него.
mkdir mysite cd mysite
Внутри каталога создаем подкаталог с файлами виртуальной среды Python:
python3 -m venv .env
В Windows эта команда может выглядеть так:
py -3 -m venv .env
Здесь venv
‒ это входящий в стандартную библиотеку Python модуль для создания виртуального окружения. После него идет имя каталога, которое может быть любым. Часто его называют .venv. Необязательная точка впереди делает каталог скрытым в дистрибутивах Linux. Тем самым подчеркивается, что виртуальное окружение не относится к самому проекту.
Таким образом, на данном этапе у нас есть каталог mysite, внутри которого находится каталог .env с файлами виртуальной среды Python. Чтобы начать в ней работать, мы должны ее активировать:
source .env/bin/activate
или
. .env/bin/acitvate
В Windows (вероятно):
.venv/Scripts/activate
После этого вы должны увидеть название среды в начале приглашения командной оболочки (по-крайней мере в Linux).
Теперь выполняем самое главное действие ‒ устанавливаем flask:
pip install Flask
После этого команда pip list
должна выдавать примерно следующее:
(.env) pl@pl-desk:~/course_flask$ pip list Package Version ------------ ------- blinker 1.7.0 click 8.1.7 Flask 3.0.0 itsdangerous 2.1.2 Jinja2 3.1.2 MarkupSafe 2.1.3 pip 22.0.2 setuptools 59.6.0 Werkzeug 3.0.1
Если закрыть терминал (командную строку), то произойдет выход из виртуального окружения. Поэтому каждый раз, когда возобновляете работу над проектом, следует запускать виртуальную среду. Для выходя из нее без закрытия терминала используется команда deactivate
.
Главный файл flask-приложения
Поскольку Flask ‒ это фреймворк языка Python, очевидно, основной файл нашего приложения будет написан на Python и иметь расширение .py. Когда этот файл запустится на исполнение, сайт "поднимется" и начнет работать (хотя не так все просто, для отображения страниц сайта в браузере необходим также веб-сервер, под которым здесь и далее понимается соответствующий софт, а не "железо").
Имя файла может быть произвольным, но не flask.py (иначе в дальнейшем при настройке веб-сервера может быть конфликт с модулем flask
при импорте). Нередко такой файл называют app.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-адрес (с портом или без) сервера.
Запуск flask-приложения на локальном веб-сервере
Фреймворк Flask имеет в своем составе веб-сервер, который позволяет запускать сайт (flask-приложение) на локальном компьютере. Использовать его в "продакшене" на удаленном компьютере (веб-сервер как железо) не получится.
Находясь в условиях виртуальной среды и в каталоге mysite, выполним следующую команду:
flask --app project run --debug
Здесь project ‒ это имя главного файла вашего приложения, но без расширения .py. Если вы назвали этот файл app.py, то команду можно использовать без опции --app
и, следовательно, без указания имени файла:
flask run --debug
Опция --debug
позволяет отображать изменения в браузере без перезагрузки веб-сервера. То есть после того, как вы вносите корректировки в программу, вам не надо останавливать веб-сервер и заново его запускать, чтобы увидеть изменения (но F5 в браузере все же нажмите), как это делается на настоящем сервере, где использовать отладчик не следует.
Если вы не устанавливали виртуальную среду, то в Ubuntu работает такая команда:
python3 -m flask --app имя_файла run --debug
После запуска веб-сервера вы увидите в терминале примерно следующее:
* Serving Flask app 'project' * Debug mode: on WARNING: This is a development server. … * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 837-251-238
В последствии, чтобы остановить работу веб-сервера, надо нажать Ctrl + C.
Когда веб-сервер запущен, набрав в адресной строке браузера http://127.0.0.1:5000 (или кликнув в терминале по этому адресу с зажатым Ctrl), вы увидите страницу со строкой, которую возвращает функция index()
нашей flask-программы.
Пин-код понадобится, если захотите что-нибудь протестировать через интерактивную консоль дебагера, которая открывается по адресу http://127.0.0.1:5000/console.
Функция 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 решает обе проблемы. Как именно, узнаем в следующих уроках.