Flask – это удобный, гибкий и простой для обучения фреймворк для разработки веб-приложений. Его преимущества – расширяемость и компактность. Это выделяет его на фоне других каркасов приложений. В этой статье будут рассмотрены основные аспекты работы с Flask. В частности, как создать первое приложение, пути, запускать сервер и осуществлять отладку программ.
Hello World
Hello World – это самое популярное приложение среди новичков, изучающих программирование. Оно выводит простую строку «Hello World», которая переводится, как «Привет, Мир». Чтобы создать такое простое приложение с помощью Python, необходимо ввести следующий код.
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Hello World' if __name__ == "__main__": app.run()
Перед тем, как записать этот код, необходимо создать файл main.py и туда его вводить.
Все, приложение для вывода строки «Hello World» уже создано. Если вы не можете понять, что означают описанные выше строки, ничего страшного. По мере изучения фреймворка все будет значительно понятнее.
Чтобы запустить наш файл, нужно в виртуальной среде Python ввести следующую инструкцию.
(env) gvido@vm:~/flask_app$ python main.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
После запуска этого файла одновременно запустится и локальный сервер для разработки. Используется порт 5000. Все, что нужно – это запустить любой браузер и ввести в адресной строке https://127.0.0.1:5000/.
В коде выше есть вторая строчка. В ней написано то, на каком адресе находится сервер. Может быть такое, что на вашем компьютере он будет другим. Поэтому вводите тот адрес, который там написан.
Также там написано, что если нажать CTRL + C, то сервер будет остановлен.
Создание приложения Flask
Каждое приложение, разработанное с помощью Flask, имеет экземпляр класса, который являет собой WSGI-приложение. Кто не знает, под этой аббревиатурой подразумевается название интерфейса, который используется для взаимодействия фреймворка и сервера.
Экземпляр показывает, что сервер передает все те запросы, которые в дальнейшем будут обрабатываться. Чтобы создать объект этого класса, используется следующая строка кода:
from flask import Flask app = Flask(__name__)
Сначала мы импортировали фреймворк так, как осуществляется импорт любой библиотеки Python. За это отвечает первая команда. Она ищет пакет flask, из которого импортирует класс Flask.
Затем мы создаем объект этого класса. Чтобы это сделать, используется конструктор Flask, которому присваивается аргумент __name__. Этот конструктор всегда должен иметь хотя бы один обязательный аргумент, роль которого и выполняет название пакета. Как правило, это название подходит.
Зачем оно нужно? Flask использует его для того, чтобы находить статические файлы, шаблоны, и так далее.
Как создавать пути во Flask?
Зачем нужен путь (маршрут, route)? Во Flask он используется для того, чтобы связать URL с функцией представления. Данная функция отвечает на запрос. Декоратор route нужен для того, чтобы это сделать.
Создание маршрута осуществляется следующим образом:
@app.route('/') def index(): return 'Hello World'
С помощью этого кода создается функция index(), которая служит обработчиком корневого URL в программе. Проще говоря, все разы, когда приложение будет получать запрос, где путь – /, осуществляется вызов функции index(). После этого происходит окончание запроса.
Также можно воспользоваться методом add_url_rule(), который применяется вместо декоратора route для маршрутизации. Это метод, а не декоратор, хотя нередко новички считают обратное.
В качестве аргументов этого метода используется не только URL, но и конечная точка, а также – название функции представления. Конечная точка относится к уникальному имени маршрута. Как правило, конечная точка и название функции представления являются идентичными.
Flask способен генерировать URL, основываясь на конечной точке также.
Код, который использовался ранее, выполняет те же действия, что и этот.
def index(): return 'Hello World' app.add_url_rule('/', 'index', index)
Как правило, используется декоратор route, но метод add_url_rule() имеет набор своих положительных сторон.
После того, как функция представления будет выполнена, она должна вернуть строку. Если попробовать получить с ее помощью другое значение, то будет выдана ошибка 500 Internal Server Error.
Разработчик имеет возможность создавать такое количество путей, сколько нужно программе. Например, эта строка кода содержит три пути.
@app.route('/') def index(): return 'Home Page' @app.route('/career/') def career(): return 'Career Page' @app.route('/feedback/') def feedback(): return 'Feedback Page'
Если будут осуществлены запросы /contact/ либо /feedback/, то произойдет вызов функции feedback(). Если попробовать осуществить переход по адресу, для которого отсутствует подходящая функция представления, то появится ошибка 404.
Ранее рассмотренные маршруты называются статичными. Но современные веб-приложения имеют динамичные URL. Что это такое? Возможно, вы обращали внимание на то, что адрес сайта изменялся в зависимости от того, что веб-ресурс показывает. Это и есть пример динамичного URL. В нем содержится одна или несколько частей, которые изменяются. И в зависимости от того, какие они, зависит содержимое страницы или та часть, которая показывается пользователю.
Типичный пример – Google диск. Если произошел вход в несколько аккаунтов, то в адресной строке, в зависимости от цифры, указанной там, зависит то, диск какого аккаунта будет открыт.
Конечно, можно по отдельности создавать маршруты для каждого пользователя. Но это очень неудобно. Гораздо разумнее использовать переменные для того, чтобы реализовать динамические части URL.
Предположим, нам надо создать два профиля. Первый будет располагаться на странице /user/1, а второй – на странице /user/2. Чтобы реализовать это, необходимо в динамической части URL прописать элемент, соответствующий шаблону <variable_name>. Потом будет просто использоваться соответствующее значение переменной, которое будет автоматически подставляться на правильное место. Все это будет осуществляться через функцию отображения.
Давайте приведем пример фрагмента кода, где динамические URL используются.
@app.route('/user/<id>/') def user_profile(id): return "Profile page of user #{}".format(id)
В приведенном фрагменте кода на том месте, которое обозначено, как <id>, будет указываться та часть, которая идет после /user/. Например, если перейти по адресу /user/100/, то приложение напишет следующую строку.
Profile page of user #100
К слову, в динамических URL могут использоваться не только числа, но и текстовые строки.
Например, возможны такие адреса:
- /user/cowboy/,
- /user/foobar10/,
- /user/@@##/.
Есть также возможность сделать так, чтобы приложение работало только с числовыми адресами. Для этого используется конвертер.
По умолчанию, динамические составляющие адреса веб-приложения отправляются в функцию в строковом формате. Если же перед названием переменной добавить префикс converter: (это шаблон, названия конвертеров будут перечислены ниже), то появится возможность работать с числовыми адресами, а вот использовать текстовые не получится.
То есть, переменная будет объявляться в таком формате:
<converter:variable_name>
Конвертер | Описание |
string | принимает любые строки (значение по умолчанию). |
int | принимает целые числа. |
float | принимает числа с плавающей точкой. |
path | принимает полный путь включая слеши и завершающий слеш. |
uuid | принимает строки uuid (символьные id). |
Эта таблица, содержащая названия и описание существующих конвертеров в этом фреймворке.
Как запустить сервер?
Чтобы запустить сервер разработки, используется объект Flask. А именно, его метод run().
if __name__ == "__main__": app.run()
Зачем мы прописываем условие в первой строчке? Оно служит гарантией того, что метод run() будет вызван исключительно в том случае, если main.py запущен в качестве основной программы. А вот если попробовать этот метод использовать при импорте в другой модуль, то вызов не осуществится.
Учтите, что этот сервер может использоваться исключительно для разработки. Для запуска непосредственно приложения его применять не рекомендуется в силу невысокой скорости его работы.
Отладка приложения
В некоторых случаях отладка даже более важная, чем непосредственно написание программы. Дело в том, что без ошибок никуда не деться. Flask имеет хороший встроенный отладчик, но вообще, рассмотрение этой темы – вопрос отдельный. Но рассмотрим особенности отладки в общих чертах.
Если отладчик выключен, то тогда показывается ошибка 500 Internal Server Error. Если же включить отладчик, то он покажет подробную информацию об ошибке, включая то, что именно произошло. Например, то, что оператор print() пробовал вывести значение неопределенной переменной. Соответственно, указывается и тип ошибки – NameError. А далее можно проверить локальные переменные, открыть консоль и сразу ввести подходящий фрагмент кода, и так далее.
Выводы
Таким образом, Flask – это мощный инструмент, который можно использовать как для разработки веб-приложений, так и их отладки. Он прост в использовании. Теперь вы умеете создавать простейшее приложение типа HelloWorld и умеете создавать несколько разных адресов. Конечно, этим спектр возможностей среды не ограничивается. Но это – базовые функции, с которых начинается обучение фреймворку.