Статья для понимания базовой структуры фреймворка FLASK.

Flask

1 Инициализировать

Все приложения FLASK должны создавать экземпляр приложения, а веб-сервер использует протокол WSGI для передачи всех запросов от клиентов (например, браузеров) этому объекту для обработки.

from flask import Flask
app = Flask(__name__)

Конструктор класса Flask имеет только один параметр, который необходимо указать, а именно имя основного модуля или пакета приложения. Этот параметр не должен сбивать с толку, он означает, что Flask использует этот параметр для определения местоположения приложения, а затем находит расположение других файлов в приложении.

2 Функции маршрутизации и просмотра

Когда вы нажимаете на веб-сайт, клиент (например, браузер) отправляет запрос на веб-сервер, а веб-сервер отправляет запрос экземпляру приложения Flask. Экземпляру приложения необходимо знать, какой код необходимо выполнить для каждого запроса URL-адреса, поэтому он сохраняет связь сопоставления между URL-адресами и функциями Python. Программа, которая обрабатывает взаимосвязь между URL-адресами и функциями, становитсямаршрутизация. Самый удобный способ определить маршруты во Flask — использовать декоратор app.route:

@app.route('/')
def index():
    return '<h1>hello world!</h1>'

Декораторы — стандартная функция языка Python. Обычный подход заключается в регистрации функций как обработчиков событий, которые вызываются при возникновении определенных событий. Таким образом, функция index(), которая обрабатывает входящие запросы, становитсяфункция просмотра, возвращаемое значение функции называетсяотклик.

Flask поддерживает динамические URL-адреса. Содержимое в угловых скобках в URL-адресе маршрутизации является динамической частью. При вызове функции просмотра Flask передает динамическую часть в функцию в качестве параметра.

@app.route('/user/<name>')
def user(name):
    return '<h1>hello, {}!</h1>'.format(name)

Динамическая часть маршрута по умолчанию использует строку. Flask поддерживает использование типов string, int, float и path. Тип пути — это специальная строка. В отличие от строки, он может содержать косую черту.

3 полное приложение

## hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>hello world!</h1>'

4 Сервер веб-разработки

Приложение Flask поставляется с сервером веб-разработки, который запускается запуском flask. Эта команда ищет экземпляры приложения в сценарии Python, указанном в переменной среды FLASK_APP. Если вы хотите запустить hello.py из предыдущего раздела
1. Убедитесь, что виртуальная среда активирована
2. Установите колбу
3. Запустите сервер веб-разработки

  • пользователь linux и macos
(venv)$ export FLASK_APP=hello.py
(venv)$ flask run
  • пользователь Windows
(venv)$ set FLASK_APP=hello.py
(venv)$ flask run

После запуска сервер начинает опрос и обработку запросов.

  • Сервер разработки, предоставляемый Flask, подходит только для разработки и тестирования и не может использоваться в качестве рабочего сервера.
  • Веб-сервер Flask также можно запустить программно, вызвав метод app.run().В более старых версиях Flask запускаемое приложение должно содержать:
if __name__ == '__main__':
    app.run()

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

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

Режим отладки по умолчанию отключен. Чтобы включить его, установите переменную среды DEBUG перед запуском фляги.

(venv)$ export FLASK_APP=hello.py
(venv)$ export FLASK_DEBUG=1
(venv)$ flask run
  • Если вы хотите запустить режим отладки при программном запуске веб-сервера, используйте app.run(debug=Ture)
  • Никогда не включайте режим отладки на рабочем сервере. Клиент может запросить выполнение удаленного кода через отладчик, что может привести к атаке на рабочий сервер. В качестве простой меры защиты вы можете запросить PIN-код при запуске отладчика.

6 параметров командной строки

Команда Flask поддерживает некоторые параметры, --help может увидеть, какие параметры доступны

(venv)$ flask --help

Параметр --host особенно полезен, он сообщает веб-серверу, на каком сетевом интерфейсе прослушивать подключения от клиентов.По умолчанию сервер веб-разработки Flask прослушивает подключения на локальном хосте, поэтому сервер получает сообщения только от компьютера, на котором находится веб-сервер. Соединение.
Если вы хотите, чтобы веб-сервер прослушал подключение к публичной сети

(venv)$ flask run --host 0.0.0.0

Любой компьютер в сети может получить доступ к серверу через http://x.x.x.x:5000, где x.x.x.x — это IP-адрес компьютера, на котором запущен сервер.

7 Цикл запрос-ответ

Цикл запрос-ответ является основным механизмом Flask.

7.1 Приложение и контекст запроса

Когда Flask получает запрос от клиента, сделайте представление доступнымОбъект запросаЗапрашиваемый объект инкапсулирует HTTP-запрос, отправленный клиентом. Во время просмотра запрашиваемого объекта в качестве функции параметров эта функция приведет к тому, что каждый представление является нескольким параметром. Чтобы избежать большого количества необязательных параметров для просмотра функционального беспорядка, использование колбыконтекстВременно сделайте некоторые объекты глобально доступными.

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

В Flask есть два типа контекстов:контекст приложенияиконтекст запроса, в таблице ниже представлены переменные, предоставляемые двумя контекстами.

имя переменной контекст инструкция
current_app контекст приложения Экземпляр текущего приложения
g контекст приложения Объект, используемый как временное хранилище при обработке запросов, эта переменная сбрасывается при каждом запросе
request контекст запроса Объект запроса, который инкапсулирует содержимое HTTP-запроса, отправленного клиентом.
session контекст запроса Пользовательская сессия, значение — это словарь, в котором хранятся значения, которые нужно «вспомнить» между запросами

Flask активирует (или отправляет) приложение и контекст запроса перед отправкой запроса и удаляет его после обработки запроса. без принудительной активации вызовет ошибку.

7.2 Отправка запроса

Когда приложение получает запрос из браузера, ему необходимо найти функцию просмотра, которая обрабатывает запрос, который называется отправкой запроса. Флэк использует app.reoute decorator для создания сопоставления между URL-адресами и функциями просмотра.

7.3 Объект запроса

Flask предоставляет объект запроса внешнему миру через запрос переменной контекста. Этот объект содержит всю информацию о HTTP-запросе, отправленном клиентом. Ниже перечислены наиболее часто используемые свойства и методы в объекте запроса.

7.4 Перехватчики запросов

Код, выполняемый до или после обработки запроса, может быть полезен, например, для проверки личности пользователя, который инициировал запрос при запросе и т. д. Чтобы избежать повторения кода в каждом представлении, Flask предоставляет возможность регистрации общих функций. Хуки запроса реализуются через декораторы.

7.5 Ответ

После того, как Flask вызывает функцию представления, она использует возвращаемое значение в качестве содержимого ответа. В большинстве случаев ответ представляет собой простую строку, которая отправляется обратно клиенту в виде страницы HTTP. Функция просмотра также может возвращать код состояния, по умолчанию 200, что означает успешную обработку, 400 означает, что запрос недействителен.

@app.route('/')
def index():
    return '<h1>bad request</h1>',400

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

8 расширений фляг

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