Flask python что это
Мега-Учебник Flask, Часть 1: «Привет, Мир!»
Это первая статья в серии, где я буду документировать мой опыт написания веб-приложения на Python, используя микрофреймворк Flask.
Моя предыстория
Приложение
Приложение, которое я собираюсь разрабатывать как часть этого руководства, является сервером микроблогов, и я решил назвать его microblog. Довольно креативно, я знаю.
Во время нашего прогресса я затрону следующие темы:
Как видите, я весьма значительно берусь за все это. Надеюсь, что это приложение, когда я его закончу, станет чем-то вроде шаблона для написания других веб-приложений.
Требования
Если ваш компьютер поддерживает Python 2.6/2.7, то все, вероятно, пойдет хорошо. Приложение из руководства должно нормально работать на Windows, OS X и Linux.
Это руководство подразумевает, что вы знакомы с окном терминала (командной консолью в случае Windows), и вы знаете основные команды для работы с файлами вашей ОС. Если это не так, то перед тем как продолжить, я рекомендую вам ознакомиться с тем, как создавать директории, копировать файлы и т.д., используя консоль.
Наконец, вы должны чувствовать себя свободно в написании кода на Python. Знакомство с модулями и пакетами этого языка также не помешает.
Установка Flask
Ну что ж, приступим!
Если у вас еще не установлен Python 2.7, то берем его отсюда.
Теперь нам нужно установить Flask и несколько расширений, которые мы будем использовать. Я предпочитаю создание виртуального окружения, где все это будет установлено таким образом, что ваша основная установка Python затронута не будет. В качестве бонуса, вам не нужен будет root доступ для установки таким способом.
Далее скачиваем virtualenv.py и кладем его внутрь новой папки.
Чтобы создать новое окружение введите следующую команду:
Эта команда создаст полноценное окружение Python внутри папки flask
Виртуальные окружения могут быть активированы и деактивированы по желанию. Активированное окружение добавляет путь своей папки bin в path системы, например, когда вы вызываете интерпретатор python, то получаете версию текущего окружения, а не системную. Лично я никогда не любил это свойство, поэтому ни разу не активировал ни одно из моих окружений, вместо этого я просто вызывал тот интерпретатор, который хотел, печатая его путь.
Прим. пер.: Перед тем как вы начнете вводить команды, хочу отметить, что в комментариях к девятой части отметится баг в flask-whooshalchemy, исправленную версию можнонужно скачать отсюда (репозиторий автора)
Если вы пользователь Linux, OS x или Cygwin, установите flask и расширения, вводя следующие команды одну за одной:
Я не буду вдаваться в подробности, поэтому если вы хотите узнать больше, прочтите документацию к flask-mail.
«Hello, World!» в Flask
Давайте начнем с создания простого скрипта инициализации нашего пакета app (файл app/__init__.py )
Скрипт выше просто создает объект приложения (наследуя Flask ), затем импортирует модуль представлений, который мы еще не написали.
Представления — это обработчики, которые отвечают на запросы веб-браузера. Представления в Flask пишутся как Python функции. Каждая функция представления сопоставляется с одним или несколькими запросами URL.
Напишем нашу первую функцию представления (файл app/views.py )
Это весьма простое представление, которое просто возвращает строку для отображения в пользовательском браузере. Два декоратора route создают привязку адресов / и /index к этой функции.
Последним шагом для получения полностью работающего веб-приложения будет создание скрипта, который стартует веб-сервер нашего приложения. Давайте назовем скрипт run.py и положим его в корневой каталог ( microblog/ ):
Для запуска вашего приложения просто запустите скрипт. На OS X, Linux и Cygwin вам следует пометить файл исполняемым перед тем как вы сможете его запустить.
Тогда скрипт может быть вызван просто:
В Windows процесс немного отличается. Нет необходимости помечать файл исполняемым. Вместо этого вам нужно запустить скрипт как аргумент интерпретатора Python:
После старта сервер будет прослушивать порт 5000, ожидая соединений. Теперь откроем браузер и введем следующий URL в адресную строку:
Или же вы можете использовать эту ссылку:
Когда вы закончите играть с сервером вы можете просто нажать Ctrl-C, чтобы остановить его.
И этим я хочу закончить первую часть этого руководства.
Те из вас, кто поленился печатать, могут скачать код из этого руководства ниже:
Обратите внимание, что вам нужно установить Flask, чтобы запустить приложение из архива выше.
Что дальше
В следующей части серии мы изменим наше маленькое приложение для использования HTML шаблонов.
#3 Основы Flask
Hello World во фреймворке Flask
Начать знакомство с Flask можно с создания простого приложения, которое выводит “Hello World”. Создаем новый файл main.py и вводим следующий код.
Остановить сервер можно с помощью комбинации CTRL+C.
Создание приложения Flask
У каждого Flask-приложения должен быть экземпляр класса. Экземпляр — это WSGI-приложение (WSGI – это интерфейс для взаимодействия сервера с фреймворком), которое показывает, что сервер передает все полученные запросы экземпляру для дальнейшей обработки. Объект класса Flask создается следующим образом:
Создание route (путей)
Маршрут (или путь) используется во фреймворке Flask для привязки URL к функции представления. Эта функция отвечает на запрос. Во Flask декоратор route используется, чтобы связать URL адрес с функций. Вот как маршрут создается.
Как вариант можно использовать метод add_url_rule() вместо декоратора route для маршрутизации. add_url_rule() — это простой метод, а не декоратор. Помимо URL он принимает конечную точку и название функции представления. Конечная точка относится к уникальному имени маршрута. Обычно, название функции представления — это и есть конечная точка. Flask может генерировать URL из конечной точки, но об этом позже. Предыдущий код аналогичен следующему:
Декоратор route используется в большинстве случаев, но у add_url_rule() есть свои преимущества.
Функция представления должна вернуть строку. Если пытаться вернуть что-то другое, сервер ответит ошибкой 500 Internal Sever Error.
Можно создать столько столько, сколько нужно приложению. Например, в следующем списке 3 пути.
Для одной функции представления может быть использовано несколько URL. Например:
Если перейти по адресу, для которого нет соответствующей функции представления, появится ошибка 404 Not Found.
Вместе этого можно отметить динамические части URL как (переменные). Эти части потом будут передавать ключевые слова функции отображения. Следующий код демонстрирует путь с динамическим элементом.
В этом списке все конвертеры, доступные во Flask:
| Конвертер | Описание |
|---|---|
| string | принимает любые строки (значение по умолчанию). |
| int | принимает целые числа. |
| float | принимает числа с плавающей точкой. |
| path | принимает полный путь включая слеши и завершающий слеш. |
| uuid | принимает строки uuid (символьные id). |
Запуск сервера
Условие __name__ == «__main__» гарантирует, что метод run() будет вызван только в том случае, если main.py будет запущен, как основная программа. Если попытаться использовать метод run() при импорте main.py в другой модуль Python, он не вызовется.
Важно: сервер разработки Flask используется исключительно для тестирования, поэтому его производительность невысокая.
Режим отладки (Debug)
Тем не менее сам браузер не сообщает о типе ошибки. Если посмотреть в консоль, то можно увидеть отчет об ошибке. В данном случае он выглядит вот так:
Когда режим отладки выключен, после изменения кода нужно каждый раз вручную запускать сервер, чтобы увидеть изменения. Но режим отладки будет перезапускать его после любых изменений в коде.
Чтобы включить режим, нужно передать аргумент debug=True методу run() :
После обновления файл main.py следующим образом его можно запускать.
Теперь при открытии https://127.0.0.1:5000/ на странице будет отладчик.
Кликнув на строчку кода на странице вывода ошибки, можно получить исходный код, где эта ошибка обнаружена, а также предыдущие и следующие строчки. Это помогает сразу понять контекст ошибки.
При наведении на строчку кода отображается иконка терминала. Нажав на нее, откроется консоль, где можно ввести любой код Python.
В ней можно проверить локальные переменные.
Если консоль открывается первый раз, то нужно ввести PIN-код.
Это мера безопасности, призванная ограничить доступ к консоли неавторизованным пользователям. Посмотреть код можно в консоли при запуске сервера. Он будет указан в начале вывода.
Завершить урок стоит созданием еще одного приложения Flask с применением всех имеющихся знаний.
Создаем еще один файл main2.py со следующим кодом:
Стоит заметить, что путь /user/ / будет работать только с теми URL, где динамическая часть ( user_id ) представлена числом.
Как Flask обрабатывает запрос?
Откуда Flask знает, какую функцию выводить, когда он получает запрос от клиента?
Как видно, есть 4 правила. Flask определяет соответствия URL в следующем формате:
Путь /static/ автоматически добавляется для статических файлов Flask. О работе со статическими файлами речь пойдет в отдельном уроке «Обслуживание статических файлов во Flask».
Веб фреймворк Flask в Python.
Что такое веб микро-фреймворк Flask.
Содержание.
Установка веб-фреймворка Flask в виртуальное окружение.
Что бы установить Flask в виртуальное окружение, необходимо выполнить следующие инструкции в терминале вашей системе.
Минимальное веб-приложение на Flask.
Как говорилось ранее, фреймворк Flask очень гибкий и не запрещает размещение всего веб-приложения в одном файле, и может выглядеть примерно следующим образом:
Код выше сохраним в файл с именем mini-flask.py и запустим с помощью Python в виртуальном окружении, куда ранее устанавливался пакет Flask. Внимание! никогда не давайте имя файлу flask.py или директории с веб-приложением (если оно большое), это вызовет конфликт с установленным пакетом Flask.
Далее запускаем файл с кодом минимального приложения.
Если используется Flask 2.0 и выше, то приложение так же можно запустить следующим образом:
Разберем, что здесь происходит: (это необходимо понять)
Публично доступный сервер веб-приложения Flask:
Режим отладки веб-приложения Flask.
Существует три способа включить отладку:
Через FLASK_ENV (Если используется Flask 1.1 и выше)
Внимание! Включенный интерактивный отладчик позволяет выполнение произвольного кода Python. Это делает его главной угрозой безопасности, и следовательно режим debug никогда не должен использоваться на «боевых» серверах.
Экранирование HTML.
При возврате HTML (тип ответа по умолчанию во Flask) любые предоставленные пользователем значения, отображаемые в выходных данных, должны быть экранированы для защиты от атак с использованием инъекций. HTML-шаблоны, созданные с помощью Jinja2 сделают это автоматически.
URL маршрутизация в веб-приложении Flask.
Правила для переменной части URL-адреса.
Несколько интересных примеров:
В Flask существуют следующие конвертеры:
Уникальные URL-адреса (301 redirect).
Следующие два правила различаются использованием косой черты в конце URL-адреса.
В первом случае, канонический URL-адрес /projects/ имеет завершающую косую черту ( / в конце адреса), что похоже на папку в файловой системе. Если обратится к URL-адресу без косой черты в конце, то Flask перенаправляет с кодом ответа сервера 301 на канонический URL-адрес с завершающей косой чертой.
Во втором случае, канонический URL-адрес /about не имеет косой черты в конце. Доступ к URL-адресу с косой чертой в конце приведет к ошибке 404 «Not Found«.
Такое поведение Flask помогает сохранить уникальность URL-адресов для этих ресурсов, что помогает поисковым системам избегать двойной индексации одной и той же страницы.
Автоматическое построение (генерация) URL-адресов.
HTTP методы (GET, POST и т.д.) URL-адреса во Flask.
Быстрое введение в HTTP-методы.
HTTP-метод сообщает серверу, что хочет сделать клиент с запрашиваемой страницей.
Подключение статических файлов CSS и JavaScript.
Чтобы сгенерировать URL-адреса для статических файлов, необходимо использовать специальное имя конечной точки ‘static’ :
Использование шаблонизатора Jinja2 в приложении Flask.
Случай 1: приложение-модуль.
Случай 2: приложение-пакет.
В шаблонах используйте всю мощь движка Jinja2. Для получения дополнительной информации перейдите к документации по Jinja2.
Вот пример шаблона:
Движок Jinja2 особенно полезен при использовании наследования шаблонов. В основном, наследование шаблонов позволяет указать определенные элементы в базовом шаблоне, а потом переопределить их в дочерних шаблонах на каждой странице (например, заголовок, блок навигации, нижний колонтитул и т.д.).
Базовое введение в то, как работает класс Markup :
Локальные переменные контекста запроса.
Представьте, что контекст является потоком обработки. Приходит запрос, и веб-сервер решает создать новый поток или что-то еще, т.к. базовый объект может работать с системами, отличными от потоков. Когда Flask начинает обработку внутреннего запроса, он определяет, является ли текущий поток активным контекстом, и связывает текущее приложение и среду WSGI с этим контекстом (потоком). Он делает это так, что одно приложение может вызывать другое приложение без прерывания работы.
Другая возможность передать среду WSGI методу app.request_context() :
Доступ к данным запроса во Flask.
Загрузка файлов на сервер.
Можно легко обрабатывать загруженные файлы с помощью Flask, при этом необходима установка атрибута enctype=’multipart/form-data’ в HTML-форме, иначе браузер вообще не будет передавать файлы.
Дополнительно смотрите раздел «Загрузка файлов во Flask».
Установка и получение файлов cookie во Flask.
Чтение файлов cookie :
Установка файлов cookie :
Обратите внимание, что файлы cookie устанавливаются для объектов Responses. Поскольку вы обычно просто возвращаете строки из функций просмотра, Flask преобразует их для вас в объекты ответа. Если вы явно хотите сделать это, вы можете использовать функцию make_response (), а затем изменить ее.
Иногда вам может потребоваться установить cookie в точке, где объект ответа еще не существует. Это возможно с помощью шаблона обратных вызовов отложенного запроса.
Так же смотрите ниже подраздел «Ответ сервера во Flask».
Перенаправление/редиректы во Flask.
Бессмысленный пример, так как пользователь будет перенаправлен с главной страницы на страницу, к которой он не может получить доступ (код HTTP 401 означает отказ в доступе), но этот пример показывает, как это работает.
Вызов страницы с HTTP-ошибкой 404, 500 и т. д. во Flask.
По умолчанию для каждого кода ошибки (в примере выше строка с abort(401) ) отображается стандартная страница ошибки. Если необходимо настроить собственную страницу с ошибкой, то можно использовать декоратор @app.errorhandler() :
Ответ сервера во Flask.
Если ничего из этого не сработает, то Flask будет считать, что возвращаемое значение является допустимым приложением WSGI, и преобразует его в объект ответа.
Представьте, что есть такая функция-представление:
Создание API с JSON во Flask.
Распространенным форматом ответа при написании API является JSON. Начать писать такой API с помощью Flask несложно. Если возвращать словарь dict из функции-представления, то он будет преобразован в ответ JSON.
Сессии/сеансы во Flask.
Как сгенерировать хорошие секретные ключи?
*Примечание о сеансах на основе файлов cookie :
Помимо клиентских сеансов/сессий встроенных в Flask, есть несколько расширений, которые добавляют возможность обрабатывать сеансы на стороне сервера.
Ведение журнала во Flask.
Flask. Наполняем «флягу» функционалом
Предисловие
В прошлом году решил для себя вплотную познакомиться c Python, а в последствии перебраться на него с PHP. На данный момент моя стезя — веб-разработка, а потому осваивать новый язык я начал именно со стороны веба, в частности, с обзора доступных фреймворков и проектов на них. Познакомившись с возможностями TurboGears, web2py, Django, я всё таки поддался «тренду» и погрузился в мир Django.
На протяжении почти года я честно пытался подружиться с ним. Написал несколько простеньких проектов, но монструозность фреймворка отпугивала, обилие «батареек» путало выбор, а с некоторыми ограничениями не хотелось мириться. Душа требовала лаконичности и однозначности, что в конечном счете привело меня к знакомству с Flask. Изучив документацию по фреймворку и смежным проектам (Jinja2, Werkzeug), я проникся идеологией и стал вплотную изучать фреймворк.
Flask позиционируется как расширяемый микрофреймворк. Это означает наличие лишь необходимого минимума функционала, но в то же время возможность добавить оный посредством расширений до требуемого проекту уровня.
Сей эпос — это мой опыт под использованию Flask и расширений для него, а точнее, попытка собрать воедино и на русском то, что может пригодиться при создании проектов практически любого уровня.
Структура и конфигурация
Для каждого проекта я придерживаюсь типовой структуры, описанной ниже. Всё достаточно тривиально и знакомо программистам Django:
А его применение так:
Для крупных проектов официальная документация рекомендует дробить функционал на так называемые blueprints — модули, структурно похожие на приложение Flask, а сам проект организовывать в пакет python. Но сегодня не об этом.
Расширения
Flask-SQLAlchemy
Любое серьезное приложение использует базы данных. Данное расширение дружит Flask с самой популярной на Python ORM-библиотекой — SQLAlchemy, позволяя использовать любые поддерживаемые ей СУБД, а также отображение таблиц в объекты Python, аналогично Django. Впрочем, SQLAlchemy позволяет обойтись и без ORM.
Flask-Script
Добавляет поддержку обслуживающих проект скриптов: запуск dev-сервера, миграции баз данных, cron-задачи и тому подобное. Следуя рекомендациям, я создаю для каждого проекта файл manage.py, где добавляются все необходимые для обслуживания команды. По-умолчанию доступна команда runserver. Запуск команд осуществляется следующим образом:
Добавить команду можно, например, реализовав потомок класса Command, входящего в пакет, и зарегистрировав ее в менеджере. Команда может содержать действия(подкоманды), ей могут передаваться параметры командной строки.
Flask-Migrate
Позволяет настроить миграции для ORM SQLAlchemy. Пакет предоставляет класс MigrateCommand, который можно использовать в связке с вышеописанным расширением Flask-Script. Для использования миграций необходимо подключить команду(пример выше), произвести начальную инициализацию, выполнив manage.py db init, затем использовать действия migrate, upgrade и downgrade данной команды для управления миграциями. Стоит отметить, что список действий для команды и их краткое описание можно получить, выполнив manage.py db help.
Flask-WTF
Реализует привязку к WTForms — замечательной библиотеке для работы с формами. Опять же, налицо аналогия с Django. В коробке: солидный набор классов полей и валидаторов для них, наследование, вложенные формы и многое другое.
Также есть расширение wtforms-alchemy для создания форм на основе моделей SQLAlchemy. Наткнулся на него совсем недавно, посему опыта работы пока нет. Впрочем, думаю, и здесь применима аналогия с Django.
Flask-Login
Добавляет базовую поддержку авторизации и пользовательских сессий. Подключение данного расширения требует достаточно много действий, поэтому попытаюсь быть максимально лаконичным и пропущу реализацию входа и выхода пользователей.
Flask-Bcrypt
Добавляет функционал для хеширования и проверки паролей.
Flask-Assets
Дружит Flask с библиотекой webassets, позволяя невероятно изящно работать с ресурсами проекта. Умеет объединять ресурсы в пакеты, компилировать scss(sass) и less, минифицировать js и css и удобно подключать их в шаблонах.
Указав в пакете(Bundle) параметр filters, мы заставим пропустить файлы пакета через заданный фильтр(ы). В нашем случае файлы минифицируются и объяденяться в один. Некоторые фильтры потребуют установки дополнительных python-модулей.
Если в конфигурации задан параметр ASSETS_DEBUG = True, то файлы пакетов не будут пропускаться через фильтры и склеиваться, а в шаблоне для каждого файла будет сгенерирован отдельный url.
P.S. При достаточно большом количестве ресурсов, следует вынести функционал по формированию пакетов(Bundle) и их регистрации в отдельный файл — например, assets.py.
Flask-DebugToolbar
Какая разработка обойдется без удобного дебаггера? Расширение добавляет debug-панель, портированную из Django, с исчерпывающей информацией о запросе. Панель отображается при заданном в конфигурации параметре DEBUG = True.
Почему вам стоит выбрать фреймворк Flask для своего следующего проекта
Авторизуйтесь
Почему вам стоит выбрать фреймворк Flask для своего следующего проекта
Senior Python Developer в Akvelon
Flask — фреймворк для создания веб-приложений на языке программирования Python, использующий набор инструментов Werkzeug, а также шаблонизатор Jinja2. Относится к категории так называемых микрофреймворков — минималистичных каркасов веб-приложений, сознательно предоставляющих лишь самые базовые возможности.
Flask зависит от некоторых внешних библиотек — таких как Werkzeug и Jinja2.
Werkzeug — это инструментарий для WSGI, стандартного интерфейса Python между веб-приложениями и различными серверами. Он предназначен как для разработки, так и развёртывания.
Пример минимального приложения на Flask «Hello World!»:
Пример приложения с шаблонизатором на Flask:
Встроенные фичи
Применение Flask
Сообществом поддерживается серия пакетов-расширений для Flask. Их название обычно начинается с flask-, например, flask-login, flask-sqlalchemy, flask-wtf.
Flask является конструктором, поэтому все дополнительные фичи придётся устанавливать вручную. Фреймворк очень хорошо подходит для небольших проектов, работающих в основном со статическим контентом. Также подходит для создания микросервисов. Из-за отсутствия встроенного ORM позволяет выбрать подходящий под ваши нужды. Де-факто используют SqlAlchemy.
Flask 2.0
С мая 2021 года Flask начал обновляться и внедрять асинхронный режим работы. Синтаксис вы можете увидеть ниже:











