Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Flask Python: Веб-разработка (Flask)

Цикл запрос-обработка-ответ включает множество элементов, которые идентичны для всех сайтов. Поэтому возникли фреймворки — специализированные библиотеки, которые определяют структуру программы. Этим они отличаются от обычных библиотек. Благодаря фреймворкам можно сосредоточиться на логике сайта, а не продумывать базовую архитектуру или кодирование вспомогательных инструментов.

Веб-фреймворки подразделяются на две большие группы: фреймворки и микрофреймворки. Микрофреймворки устроены проще и содержат только минимально необходимую обвязку, чтобы комфортно работать в архитектуре HTTP — запрос-ответ. Они идеально подходят для обучения, потому что просты в эксплуатации и не отвлекают от главного.

Один из наиболее популярных python-микрофреймворков — Flask. В этом уроке познакомимся с ним и узнаем его возможности. Также научимся создавать минимальное Flask-приложение и запускать его с помощью development-сервера. В конце расскажем, как включить режим отладки, чтобы сообщения об ошибках отображались прямо в браузере в удобном для просмотра виде.

Возможности Flask

Микрофреймворк Flask умеет:

  • Разбирать запросы и производить маршрутизацию по адресу, глаголу HTTP, параметрам запроса
  • Формировать ответы на запросы, которые содержат нужные статус, заголовки, cookies, данные в необходимом формате, например: текст, JSON
  • Работать с сессиями
  • Удобно вызывать шаблонизатор для формирования ответа

При этом с помощью Flask нельзя:

  • Работать с данными в базе данных — не содержит встроенной ORM
  • Формировать интерфейс администратора — administrator interface, админка
  • Обрабатывать формы ввода данных и валидацию этих данных

Чтобы добавить эти и другие возможности в приложение, нужно подключить внешние библиотеки. Ознакомиться с полным перечнем библиотек и их возможностями можно на странице pypi.org.

Создание минимального Flask-приложения

Чтобы создать минимальное Flask-приложение, нужно выполнить следующие шаги:

  1. Создать новый python-проект в директории hexlet-flask-example и добавить в зависимости Flask
  2. Создать в корне директории модуль example.py со следующим содержимым:
from flask import Flask

# Это callable WSGI-приложение
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Welcome to Flask!'

Разберем код выше подробнее:

  1. Импортируем класс-инициализатор Flask. Его экземпляр и будет нашим WSGI-приложением:

    from flask import Flask
    
  2. Инстанцируем экземпляр, где класс принимает первым аргументом имя модуля нашего приложения __name__. Это нужно, чтобы Flask знал, где искать шаблоны и статические файлы:

    app = Flask(__name__)
    
  3. Используем декоратор route(), который связывает функцию-обработчик с конкретным адресом нашего сайта. Об обработчиках и роутинге поговорим в следующих уроках:

    @app.route('/')
    def hello_world():
        ...
    
  4. Функция-обработчик возвращает ответ, который выведется в браузере:

    def hello_world():
        return 'Welcome to Flask!'
    

Запуск с помощью development-сервера

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

Запустим приложение встроенным сервером. Введем в терминале следующие команды:

# Если вы используете poetry, то не забудьте добавить poetry run
flask --app example run

Здесь первая команда задает модуль, в котором объявлен объект WSGI-приложения. Вторая запускает сервер разработчика — developing server. Создадим файл Makefile в корне проекта и добавим туда задачу start:

start:
    flask --app example run

Выполним запуск:

make start

Вывод будет таким:

 * Serving Flask app 'example.py'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

Flask предупреждает, что в данный момент запущен сервер разработчика, а в реальных условиях понадобится «промышленный» WSGI-сервер — production WSGI server.

Пока мы не остановим сервер нажатием Ctrl+C, в браузере по адресу http://127.0.0.1:5000/ можно будет увидеть текст «Welcome to Flask!»:

Hello World

Режим отладки

Если в приложении случится ошибка, то мы увидим заготовленное сообщение с подобным текстом: "Internal Server Error". Но во время разработки хочется видеть вывод ошибки, и чтобы была возможность не перезапускать руками сервер при каждом изменении кода. И development-сервер это умеет, нужно только включить режим отладки:

flask --app example --debug run

Изменим тогда и команду в Makefile:

start:
    flask --app example --debug run

Когда мы перезапустим сервер, то вывод будет немного отличаться:

 * Serving Flask app 'example.py'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: xxx-xxx-xxx

Теперь включен режим отладки — «Debugger is active!». С включенным отладчиком сообщения об ошибках будут отображаться прямо в браузере в удобном для просмотра виде. Про встроенный во Flask отладчик Werkzeug расскажем подробнее позднее.

Также теперь все изменения в коде будут автоматически перезапускать сервер. Например, попробуйте изменить выводимый текст на ‘Hello, Hexlet!’. Как только вы сохраните код, сервер перезагрузится, и вы увидите в браузере новое сообщение.

Вывод

В этом уроке мы познакомились с одним из наиболее популярных python-микрофреймворков — Flask, а также узнали его возможности. Еще мы научились создавать минимальное Flask-приложение и запускать его с помощью development-сервера. Также мы знаем, как включить режим отладки, чтобы сообщения об ошибках отображались прямо в браузере в удобном для просмотра виде.


Самостоятельная работа

  1. Создайте новый проект и установите в его окружение пакет flask
  2. Создайте модуль example.py с содержимым из примера в начале урока
  3. Создайте Makefile с командой make start. Измените ее, чтобы она запускала Flask с помощью poetry
  4. Запустите сервер
  5. Откройте в браузере адрес, который вам покажет сервер в момент запуска
  6. Убедитесь, что текст отображается, а изменения строки в исходном файле отражаются на выводимом тексте без ручного перезапуска сервера
  7. Попробуйте вместо строки вернуть число. В ответ на это браузер должен отобразить ошибку TypeError, и она же должна быть видна в терминале, в котором запущен сервер

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
2 февраля 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»