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

Что такое Flask?

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

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

  • Werkzeug — библиотека утилит WSGI
  • jinja2 — его шаблонизатор

Примечание

WSGI — это в основном протокол, определенный для того, чтобы Python-приложение могло взаимодействовать с веб-сервером и, таким образом, использоваться как веб-приложение вне CGI.

Что такое шаблонизаторы?

Создавали ли вы когда-нибудь веб-сайт? Сталкивались ли вы с проблемой, что для поддержания единого стиля веб-сайта вам приходилось многократно писать один и тот же текст? Пытались ли вы когда-нибудь изменить стиль такого веб-сайта?

Если ваш веб-сайт содержит всего несколько страниц, изменение его стиля займет у вас некоторое время, но это выполнимо. Однако, если у вас много страниц (например, список товаров, которые вы продаете в своем магазине), эта задача становится непосильной.

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

Использование шаблонизатора сэкономит вам много времени при создании вашего приложения, а также при его обновлении и поддержке.

Приложение “Hello world” в Flask

Мы собираемся создать очень базовое приложение с использованием Flask.

  • Создайте структуру проекта
mkdir -p hello_flask/{templates,static}

Это базовая структура вашего веб-приложения:

$ tree hello_flask/
hello_flask/
|-- static
`-- templates

Папка templates предназначена для хранения шаблонов. Папка static предназначена для хранения любых файлов (изображений, CSS, JavaScript), необходимых для веб-приложения.

  • Создайте файл приложения
cd hello_flask
vim hello_flask.py

Поместите следующий код в этот файл:

#!/usr/bin/env python

import flask



APP = flask.Flask(__name__)


@APP.route('/')
def index():
    """ Отображает главную страницу, доступную по адресу '/'
    """
    return flask.render_template('index.html')


if __name__ == '__main__':
    APP.debug=True
    APP.run()
  • Создайте шаблон index.html
vim templates/index.html

Поместите следующий код в этот файл

<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset="utf-8" />
  <title>Hello world!</title>
  <link type="text/css" rel="stylesheet"
        href="{{ url_for('static',
              filename='hello.css')}}" />
</head>
<body>

It works!

</body>
</html>
  • Запустите приложение Flask
python hello_flask.py

Перейдите по адресу http://127.0.0.1:5000/ , это должно просто показать вам на черном фоне белым текстом надпись “It works!” (см. рисунок ниже).

_images/hello_flask_Index.png

Использование аргументов в Flask

В этом разделе мы рассмотрим, как использовать страницу в соответствии с URL, используемым пользователем.

Для этого мы обновим hello_flask.py.

  • Добавьте следующую запись в hello_flask.py
@APP.route('/hello/<name>/')
def hello(name):
    """ Отображает страницу, приветствующую посетителя.
    """
    return flask.render_template('hello.html', name=name)
  • Создайте следующий шаблон hello.html
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset="utf-8" />
    <title>Hello</title>
    <link type="text/css" rel="stylesheet"
          href="{{ url_for('static',
               filename='hello.css')}}" />
</head>
<body>

      Hello {{name}}

</body>
</html>
  • Запустите приложение Flask
python hello_flask.py

Перейдите по адресу http://127.0.0.1:5000/ , это должно просто показать вам на черном фоне белым текстом “It works!”.

Перейдите по адресу http://127.0.0.1:5000/hello/you это должно вернуть вам текст “Hello you” (см. рисунок ниже).

_images/hello_flask_hello.png

Все, что вы поместите после /hello/ в URL, будет возвращено вам на странице.

Это ваше первое использование шаблона, мы установили переменную name в hello_flask.py (см. строку возврата функции hello). Эта переменная затем отображается на самой странице с использованием синтаксиса {{name}}.

Дополнительная работа

Используйте шаблоны

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

  • Создайте шаблон master.html
<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset="utf-8" />
  <title>{% block title %}{% endblock %} - Hello Flask!</title>
  <link type="text/css" rel="stylesheet"
       href="{{ url_for('static',
                        filename='hello.css')}}" />
</head>
<body>

{% block body %}{% endblock %}

</body>
</html>
  • Настройте шаблон index.html
{% extends "master.html" %}

{% block title %}Home{% endblock %}

{% block body %}
It works!
{% endblock %}

Как вы можете видеть, в шаблоне master.html мы определили две секции, блоки которые называются title и body.

В шаблоне index.html мы говорим, что этот шаблон опирается на шаблон master.html, затем мы определяем содержимое для размещения в этих двух секциях (блоках). В первом блоке title мы говорим, чтобы поместить слово Home, во втором блоке мы определяем, что хотим иметь в теле страницы.

  • В качестве упражнения, преобразуйте другой шаблон hello.html для использования шаблона master.html также.
  • Добавьте ссылку на главную страницу со страницы hello

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

Например, если ваш сайт развернут на: /myapp/, Flask автоматически добавит /myapp/ ко всем ссылкам без необходимости указывать это.

Для создания ссылки в шаблоне Flask использует функцию url_for(). Эта функция принимает в качестве первого аргумента функцию, которую вы хотите вызвать (ссылку на). Следующие аргументы — это аргументы самой функции (например, аргумент name функции hello.

Настройте шаблон hello.html для добавления ссылки на главную страницу

<a href="{{ url_for('index') }}"><button>Home</button></a>
  • В качестве задания добавьте ссылку на страницу hello с главной страницы для вас.