Перейти к содержимому

Flask название вкладки как сделать

  • автор:

Использование шаблонов страниц сайта

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

from flask import Flask app = Flask(__name__) @app.route("/") def index(): return ''' ''' @app.route("/about") def about(): return "

Про Flask

"
if __name__ == "__main__": app.run(debug=True)

Кроме того структура страницы может меняться и вносить изменения непосредственно в программе – это плохой подход к программированию. Поэтому все HTML-шаблоны хранятся в виде отдельных файлов и загружаются по мере необходимости.

Для работы с шаблонами Flask использует стандартный модуль Jinja (если вы не знаете что это такое и как происходит обработка шаблонов, то смотрите занятия по этой ссылке).

Чтобы воспользоваться шаблонизатором во Flask нужно импортировать его элемент render_template:

from flask import Flask, render_template

и, затем, в обработчике index вызвать его:

@app.route("/") def index(): return render_template('index.html')

Следующий вопрос: где расположить шаблон ‘index.html’, чтобы он был найден и загружен модулем Flask. Существует следующее простое соглашение: по умолчанию все шаблоны берутся из подкаталога templates, относительно рабочего каталога программы (или соответствующем подкаталоге пакета). Так мы и сделаем. Разместим в этом подкаталоге файл index.html со следующим содержимым:

DOCTYPE html> html> head> title>Главная страница сайта/title> /head> body> h1>Главная страница сайта/h1> /body> /html>

Обратите внимание, для корректного отображения кириллицы все шаблоны рекомендуется сохранять в кодировке utf-8. Тем более, что сам Python, начиная с версии 3, по умолчанию использует юникод.

Запустим программу и при переходе на главную страницу увидим отображение нашего шаблона в браузере:

По аналогии создадим такой же шаблон about.html и также будем загружать его при обращении по URL /about:

@app.route("/about") def about(): return render_template('about.html')

Теперь, посещая эту страницу, пользователь увидит:

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

Передача шаблонам параметров

Я много раз произносил слово «шаблон», но что оно означает? Если посмотреть на файлы index.html или about.html, то это просто текст, который загружается и отдается браузеру по соответствующему запросу. Все так, но в этих же файлах можно прописать конструкции для отображения информации, например, из БД. Давайте для начала сделаем так, чтобы на каждой странице был свой заголовок, переданный ей через параметр title. Это можно сделать так:

DOCTYPE html> html> head> title>{{title}}/title> /head> body> h1>{{title}}/h1> /body> /html>

А в обработчике указать этот параметр:

return render_template('index.html', title="Про Flask")

Все, теперь вместо title будет подставлена строка «Про Flask». Удобно, правда? Вот в этом и есть роль шаблонов: они описывают структуру страницы, а ее наполнение происходит динамически в самой программе.

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

Давайте для примера еще добавим в документ простой список, пусть он символизирует наше меню. Шаблон для него можно прописать так (в файле index.html):

ul> {% for m in menu %} li>{{m}}/li> {% endfor %} /ul>

А в программе добавить список и передать его шаблону:

menu = ["Установка", "Первое приложение", "Обратная связь"] @app.route("/") def index(): return render_template('index.html', title="Про Flask", menu = menu)

При обновлении страницы увидим следующее:

Добавим большей гибкости нашему шаблону и для заголовка пропишем следующую конструкцию:

{% if title %} title>Про Flask - {{title}}/title> {% else %} title>Про Flask/title> {% endif %}

И то же самое для тега h1:

{% if title -%} h1>{{title}}/h1> {% else -%} h1>Про Flask/h1> {% endif %}

Теперь в обработчике можно не указывать параметр title, тогда будет отображаться строка «Про Flask», а иначе, подставляться другой заголовок, причем во вкладке браузеры будем видеть «Про Flask — ». Например, пропишем такой же шаблон для about.html и в обработчике добавим:

def about(): return render_template('about.html', title = "О сайте", menu = menu)

В результате, вид страницы будет такой:

Но, наши созданные шаблоны, мягко говоря, не очень, т.к. они содержат много повторяющегося кода. Лучшим вариантом будет воспользоваться механизмом расширения (наследования) шаблона для создания дочерних страниц сайта. Для начала определим базовый шаблон страницы – ее структуру, следующим образом (файл base.html):

DOCTYPE html> html> head> {% block title -%} {% if title %} title>Про Flask - {{title}}/title> {% else %} title>Про Flask/title> {% endif %} {% endblock %} /head> body> {% block content -%} {%- block mainmenu -%} ul> {% for m in menu -%} li>{{m}}/li> {% endfor -%} /ul> {% endblock mainmenu -%} {% if title -%} h1>{{title}}/h1> {% else -%} h1>Про Flask/h1> {% endif -%} {% endblock -%} /body> /html>

А в дочерних расширим этот базовый шаблон:

для index.html:

{% extends 'base.html' %} {% block content %} {{ super() }} Содержимое главной страницы {% endblock %}

для about.html:

{% extends 'base.html' %} {% block content %} {{ super() }} Содержимое страницы "о сайте" {% endblock %}

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

Видео по теме

Flask #1: Что это такое? Простое WSGI-приложение

Flask #2: Использование шаблонов страниц сайта

Flask #3: Контекст приложения и контекст запроса

Flask #4: Функция url_for и переменные URL-адреса

Flask #5: Подключение внешних ресурсов и работа с формами

Flask #6: Мгновенные сообщения — flash, get_flashed_messages

Flask #7: Декоратор errorhandler, функции redirect и abort

Flask #8: Создание БД, установление и разрыв соединения при запросах

Flask #9: Добавление и отображение статей из БД

Flask #10: Способ представления полноценных HTML-страниц на сервере

Flask #11: Формирование ответа сервера, декораторы перехвата запроса

Flask #12: Порядок работы с cookies (куками)

Flask #13: Порядок работы с сессиями (session)

Flask #14: Регистрация пользователей и шифрование паролей

Flask #15: Авторизация пользователей на сайте через Flask-Login

Flask #16: Улучшение процесса авторизации (Flask-Login)

Flask #17: Загрузка файлов на сервер и сохранение в БД

Flask #18: Применение WTForms для работы с формами сайта

Flask #19: Обработка ошибок во Flask-WTF

Flask #20: Blueprint — что это такое, где и как использовать

Flask #21: Blueprint — подключение к БД и работа с ней

Flask #22: Flask-SQLAlchemy — установка, создание таблиц, добавление записей

Flask #23: Операции с таблицами через Flask-SQLAlchemy

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

Руководство. Начало работы с веб-платформой Flask в Visual Studio

Область применения:yesVisual Studio Visual Studio для Mac noVisual Studio Code no

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

Flask называют «микро»-платформой, так как она не предоставляет напрямую такие функции, как проверка форм, абстракция базы данных, проверка подлинности и т. д. Эти функции предоставляются специальными пакетами Python, называемыми расширениями Flask. Расширения легко интегрируются с Flask и отображаются так, как будто являются частью самой среды Flask. Например, Flask не предоставляет модуль шаблонов страницы. Использование шаблонов обеспечивается расширениями, такими как Jinja и Jade, как демонстрируется в этом учебнике.

В этом руководстве описано следующее:

  • Создание базового проекта Flask в репозитории Git с помощью шаблона «Пустой веб-проект Flask» (шаг 1).
  • Создание приложения Flask с одной страницей и преобразование этой страницы для просмотра с помощью шаблона (шаг 2).
  • Обслуживание статических файлов, добавление страниц и использование наследования шаблонов (шаг 3).
  • Использование шаблона веб-проекта Flask для создания приложения с несколькими страницами и адаптивным дизайном (шаг 4).

Выполнив эти действия, вы создадите единое решение Visual Studio, которое содержит два отдельных проекта. Мы создадим проект, используя разные шаблоны проектов Flask, которые входят в состав Visual Studio. Сохраняя проекты в одном и том же решении, вы можете легко переключаться между различными файлами для сравнения.

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

Необходимые компоненты

  • Visual Studio 2017 или более поздней версии в Windows со следующими параметрами:
    • Рабочая нагрузка Разработка на Python (вкладка Рабочая нагрузка в установщике). Инструкции см. в статье Установка поддержки Python в Visual Studio.
    • Git для Windows и расширение GitHub для Visual Studio на вкладке Отдельные компоненты в разделе Средства кода.
    • Visual Studio 2022 в Windows со следующими параметрами:
      • Рабочая нагрузка Разработка на Python (вкладка Рабочая нагрузка в установщике). Инструкции см. в статье Установка поддержки Python в Visual Studio.
      • Git для Windows на вкладке Отдельные компоненты в разделе Средства для работы с кодом.

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

      Разработка Python в настоящее время не поддерживается в Visual Studio для Mac. В системах Mac и Linux используйте учебник Расширение Python в Visual Studio Code.

      Шаг 1–1. Создание проекта и решения Visual Studio

      1. В Visual Studio выберите Файл>Создать>Проект, выполните поиск по запросу «Flask» и выберите шаблон Пустой веб-проект Flask. (Шаблон также можно найти в папке Python>Интернет в списке слева.) VS 2019 New project dialog in Visual Studio for the Blank Flask Web Project
      2. В нижней части диалогового окна в полях введите следующие сведения (как показано на предыдущем рисунке), а затем нажмите кнопку ОК.
        • Имя. В качестве имени проекта Visual Studio укажите BasicProject. Это имя используется также и для проекта Flask.
        • Расположение. Укажите расположение для создания решения и проекта Visual Studio.
        • Имя решения. Укажите LearningFlask. В этом руководстве данное имя подходит для решения как контейнер для нескольких проектов.
        • Создать каталог для решения. Оставьте флажок установленным (по умолчанию).
        • Создать новый репозиторий Git. Выберите этот параметр (по умолчанию флажок не установлен), чтобы при создании решения в Visual Studio был создан локальный репозиторий Git. Если этот параметр не отображается, запустите Visual Studio Installer и добавьте Git для Windows и Расширение GitHub для Visual Studio на вкладке Отдельные компоненты в разделе Средства для работы с кодом.
      3. Через некоторое время в Visual Studio отобразится диалоговое окно с сообщением Для этого проекта требуются внешние пакеты (как показано ниже). Это диалоговое окно открывается, так как шаблон включает файл requirements.txt, ссылающийся на последнюю версию пакета Flask 1.x. (Выберите Показать необходимые пакеты, чтобы просмотреть точный список зависимостей.) Prompt saying that the project requires external packages
      4. Выберите параметр I will install them myself (Я установлю их самостоятельно). В ближайшее время вы можете создать виртуальное окружение и исключить его из системы управления версиями. (Окружение всегда можно создать из requirements.txt.)

      VS 2022 New project dialog in Visual Studio for the Blank Flask Web Project

      1. В Visual Studio выберите Файл>Создать>Проект и выполните поиск по запросу «Flask». Затем выберите пустой шаблон Веб-проект Flask и нажмите кнопку Далее.
      2. Настройте новый проект, указав следующие сведения, а затем нажмите кнопку Создать.
        • Имя. В качестве имени проекта Visual Studio укажите BasicProject. Это имя используется также и для проекта Flask.
        • Расположение. Укажите расположение для создания решения и проекта Visual Studio.
        • Имя решения. Укажите LearningFlask. В этом руководстве данное имя подходит для решения как контейнер для нескольких проектов.

      Шаг 1–2. Проверка элементов управления Git и публикация в удаленном репозитории

      Так как вы выбрали Создать новый репозиторий Git в диалоговом окне Новый проект, проект уже был зафиксирован в локальной системе управления версиями сразу после завершения процесса создания. На этом шаге вы ознакомитесь с элементами управления Git в Visual Studio и окном Team Explorer, в котором вы будете работать с системой управления версиями.

      Git controls in the Visual Studio window

        Проверьте элементы управления Git в нижнем углу главного окна Visual Studio. Эти элементы управления отображаются в следующем порядке (слева направо): неотправленные фиксации, незафиксированные изменения, имя репозитория и текущая ветвь.

      Add to Source Control appears in Visual Studio if you

      Примечание. Если вы не выбрали параметр Создать новый репозиторий Git в диалоговом окне Новый проект, элементы управления Git отображают только команду Добавить в систему управления версиями, которая создает локальный репозиторий.

    • Нажмите кнопку «Изменить» и в Visual Studio на странице изменений откроется окно Team Explorer. Так как созданный проект уже зафиксирован в системе управления версиями автоматически, ожидающие изменения не отобразятся. Team Explorer window on the Changes page
    • В строке состояния Visual Studio нажмите кнопку фиксации (стрелка вверх со значением 2), чтобы открыть страницу Синхронизация в Team Explorer. Так как у вас есть только локальный репозиторий, страница предоставляет простые варианты для публикации репозитория для разных удаленных репозиториев. Team Explorer window showing available Git repository options for source controlДля своих проектов вы можете выбрать любую службу. В этом руководстве используется GitHub. Завершенный пример кода для работы см. в репозитории Microsoft/python-sample-vs-learning-flask.
    • При выборе любого из элементов управления ПубликацияTeam Explorer предложит проверить зависимости для получения дополнительной информации. Например, при публикации примера для этого руководства сначала нужно было создать репозиторий, и в этом случае параметр Отправить в удаленный репозиторий использовался с URL-адресом репозитория. Team Explorer window for pushing to an existing remote repositoryЕсли у вас нет репозитория, параметры Опубликовать в GitHub и Отправить в Azure DevOps позволяют создать его непосредственно из Visual Studio.
    • При работе с этим руководством вы будете периодически использовать элементы управления в Visual Studio для фиксации и отправки изменений. Мы напомним вам об этом при необходимости.
    • Для быстрого перемещения в Team Explorer выберите заголовок (Изменения или Отправить), чтобы открыть контекстное меню доступных страниц.

      На этом шаге вы ознакомитесь с элементами управления Git в Visual Studio и окном Team Explorer, в котором вы будете работать с системой управления версиями.

      1. Чтобы зафиксировать проект в локальной системе управления версиями, выберите команду Добавить в систему управления версиями в нижнем углу главного окна Visual Studio и выберите параметр Git. Это действие открывает окно репозитория Git, в котором можно создать и отправить новый репозиторий. Create a Git repository
      2. После создания репозитория в нижней части появится набор новых элементов управления Git. Эти элементы управления отображаются в следующем порядке (слева направо): неотправленные фиксации, незафиксированные изменения, текущая ветвь и имя репозитория. Git controls in the Visual Studio window
      3. Нажмите кнопку «Изменить Git» и в Visual Studio на странице Изменения Git откроется окно Team Explorer. Так как созданный проект уже зафиксирован в системе управления версиями автоматически, ожидающие изменения не отобразятся. Team Explorer window on the Git Changes page
      4. В строке состояния Visual Studio нажмите кнопку фиксации (стрелка вверх со значением 2), чтобы открыть страницу Синхронизация в Team Explorer. Так как у вас есть только локальный репозиторий, страница предоставляет простые варианты для публикации репозитория для разных удаленных репозиториев. Team Explorer window showing available Git repository options for source controlДля своих проектов вы можете выбрать любую службу. В этом руководстве используется GitHub. Завершенный пример кода для работы см. в репозитории Microsoft/python-sample-vs-learning-django.
      5. При выборе любого из элементов управления ПубликацияTeam Explorer предложит проверить зависимости для получения дополнительной информации. Например, при публикации образца для этого учебника сначала необходимо создать репозиторий. В этом случае параметр Отправить в удаленный репозиторий использовался с URL-адресом репозитория. Team Explorer window for pushing to an existing remote repositoryЕсли у вас нет репозитория, параметры Опубликовать в GitHub и Отправить в Azure DevOps позволяют создать его непосредственно из Visual Studio.
      6. При работе с этим руководством вы будете периодически использовать элементы управления в Visual Studio для фиксации и отправки изменений. Инструкции в этом учебнике напомнят вам об этом при необходимости.

      Для быстрого перемещения в Team Explorer выберите заголовок (Изменения или Отправить), чтобы открыть контекстное меню доступных страниц.

      Вопрос. Каковы преимущества использования системы управления версиями с самого начала проекта?

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

      Дополнительные сведения о системе управления версиями как средства автоматизации см. в статье Mobile DevOps — The Source of Truth: The Role of Repositories in DevOps (DevOps для мобильных устройств. Источник правды. Роль репозиториев в DevOps) в журнале MSDN. Эта статья написана для мобильных приложений, однако она применима также и к веб-приложениям.

      Вопрос. Можно ли отменить автоматическую фиксацию нового проекта в Visual Studio?

      Ответ: Да. Чтобы отключить автоматическую фиксацию, перейдите на страницу Параметры в Team Explorer, выберите Git>Глобальные параметры, снимите флажок Commit changes after merge by default (Фиксировать изменения после объединения по умолчанию), а затем нажмите кнопку Обновить.

      Шаг 1–3. Создание виртуального окружения и его исключение из системы управления версиями

      Теперь, когда вы настроили управление версиями для проекта, вы можете создать виртуальную среду с необходимыми пакетами Flask, которым требуется проект. Затем с помощью Team Explorer вы сможете исключить папку окружения из системы управления версиями.

      1. В обозревателе решений щелкните правой кнопкой мыши элемент Окружения Python и выберите Добавление виртуального окружения. Add Virtual environment command in Solution Explorer
      2. Откроется диалоговое окно Добавление виртуального окружения с сообщением Найден файл requirements.txt. Это сообщение указывает, что Visual Studio использует этот файл для настройки виртуальной среды. Add virtual environment dialog with requirements.txt message
      3. Нажмите кнопку Создать, чтобы принять параметры по умолчанию. (При желании вы можете изменить имя виртуального окружения, просто изменив имя своей подпапки. Однако env является стандартным соглашением.)
      4. Согласитесь с привилегиями администратора при появлении запроса, а затем подождите несколько минут, пока Visual Studio загружает и устанавливает пакеты. Для Flask и зависимостей этот процесс представляет собой расширение нескольких тысяч файлов и примерно 100 подпапок. Ход выполнения отображается в окне Вывод Visual Studio. Во время ожидания просмотрите раздел вопросов. Можно также просмотреть описание зависимостей Flask на странице установки Flask (flask.pcocoo.org).
      5. В элементах управления Visual Studio Git (в строке состояния) выберите индикатор изменений (со значением 99*), который открывает страницу Изменения в Team Explorer. Создание виртуального окружения привело к многочисленным изменениям, но вам не нужно включать их в систему управления версиями, потому что вы (или кто-то еще, клонирующий проект) в любое время сможете воссоздать окружение из requirements.txt. Чтобы исключить виртуальное окружение, щелкните правой кнопкой мыши папку env и выберите Игнорировать эти локальные элементы. Ignoring a virtual environment in source control changes
      6. После исключения виртуального окружения единственными оставшимися изменениями являются файл проекта и .gitignore. Файл .gitignore содержит добавленную запись для папки виртуального окружения. Вы можете дважды щелкнуть файл, чтобы увидеть различия.
      7. Введите сообщение о фиксации и нажмите кнопку Зафиксировать все, а затем при желании отправьте фиксации в удаленный репозиторий.
      1. В Обозревателе решений щелкните правой кнопкой мыши узел Окружения Python и выберите Добавить среду. Add Virtual environment command in Solution Explorer
      2. Выберите Создать, чтобы принять значения по умолчанию в диалоговом окне «Добавление виртуальной среды». (При желании вы можете изменить имя виртуального окружения, просто изменив имя своей подпапки. Однако env является стандартным соглашением.) Add virtual environment dialog with requirements.txt message
      3. Согласитесь на права администратора при появлении запроса, а затем подождите несколько минут, пока Visual Studio скачивает и устанавливает пакеты. В это время несколько тысяч файлов передаются в такое же количество вложенных папок. Ход выполнения отображается в окне Вывод Visual Studio. Во время ожидания просмотрите раздел вопросов.
      4. В элементах управления Visual Studio Git (в строке состояния) выберите индикатор изменений (со значением 99*), который открывает страницу Изменения в Team Explorer. Создание виртуального окружения привело к многочисленным изменениям, но вам не нужно включать их в систему управления версиями, потому что вы (или кто-то еще, клонирующий проект) в любое время сможете воссоздать окружение из requirements.txt. Чтобы исключить виртуальное окружение, щелкните правой кнопкой мыши папку env и выберите Игнорировать эти локальные элементы. Ignoring a virtual environment in source control changes
      5. После исключения виртуального окружения единственными оставшимися изменениями являются файл проекта и .gitignore. Файл .gitignore содержит добавленную запись для папки виртуального окружения. Вы можете дважды щелкнуть файл, чтобы увидеть различия.
      6. Введите сообщение о фиксации и нажмите кнопку Зафиксировать все, а затем отправьте фиксации в удаленный репозиторий.

      Вопрос. Зачем нужно создавать виртуальное окружение?

      Ответ. Виртуальное окружение — это хороший способ изолировать конкретные зависимости вашего приложения. Такая изоляция позволяет избежать конфликтов в глобальном окружении Python и помогает как тестированию, так и совместной работе. Позже при разработке приложения вы неизменно используете множество необходимых пакетов Python. Сохраняя пакеты в виртуальном окружении, зависящем от проекта, вы сможете легко обновить файл requirements.txt проекта, описывающий это окружение в системе управления версиями. При копировании проекта на любые другие компьютеры, включая серверы сборки, серверы развертывания и другие компьютеры разработки, легко воссоздать окружение, используя только requirements.txt (поэтому окружение не должно находиться в системе управления версиями). См. дополнительные сведения о виртуальных окружениях.

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

      Ответ. Сначала измените файл .gitignore, чтобы исключить папку. Найдите раздел с комментарием # Python Tools for Visual Studio (PTVS) в конце и добавьте новую строку для папки виртуального окружения, например /BasicProject/env . (Так как Visual Studio не отображает файл в Обозревателе решений, откройте его непосредственно с помощью команды меню Файл>Открыть>Файл. Вы также можете открыть файл из Team Explorer: на странице Параметры выберите Параметры репозитория, перейдите в раздел Игнорировать & Файлы атрибутов, а затем щелкните ссылку Изменить рядом с .gitignore.)

      Во-вторых, откройте окно команд, перейдите к папке типа BasicProject, содержащей папку виртуального окружения, например env, и выполните команду git rm -r env . Затем скопируйте эти изменения из командной строки ( git commit -m ‘Remove venv’ ) или зафиксируйте на странице изменений в Team Explorer.

      Шаг 1–4. Изучение стереотипного кода

      Blank Flask project files in Solution Explorer

      1. После завершения создания проекта вы увидите решение и проект в обозревателе решений, где проект содержит только два файла, app.py и requirements.txt:
      2. Как уже отмечалось, в файле requirements.txt указана зависимость пакета Flask. Этот файл предлагает создать виртуальное окружение при первом создании проекта.
      3. Один файл app.py состоит из трех частей. Первая часть — инструкция import для Flask, создающая экземпляр класса Flask , который присваивается переменной app , а затем назначает переменную wsgi_app (она удобна при развертывании на веб-узле, но сейчас не используется):
      from flask import Flask app = Flask(__name__) # Make the WSGI interface available at the top level so wfastcgi can get it. wsgi_app = app.wsgi_app 
      if __name__ == '__main__': import os HOST = os.environ.get('SERVER_HOST', 'localhost') try: PORT = int(os.environ.get('SERVER_PORT', '5555')) except ValueError: PORT = 5555 app.run(HOST, PORT) 
      @app.route('/') def hello(): """Renders a sample page.""" return "Hello World!" 

      Вопрос. Для чего предназначен аргумент name в классе Flask?

      Ответ. Аргумент представляет имя модуля или пакет приложения и сообщает Flask, где следует искать шаблоны, статические файлы и другие ресурсы, относящиеся к приложению. Для приложений, содержащихся в одном модуле, __name__ всегда имеет правильное значение. Он также важен для расширений, которым требуется отладочная информация. Дополнительные сведения и дополнительные аргументы см. в документации по классу Flask (flask.pocoo.org).

      Вопрос. Может ли функция иметь несколько декораторов маршрута?

      Ответ. Да, можно использовать любое необходимое число декораторов, если одна функция обслуживает несколько маршрутов. Например, чтобы использовать функцию hello для «/» и «/hello», используйте следующий код:

      @app.route('/') @app.route('/hello') def hello(): """Renders a sample page.""" return "Hello World!" 

      Вопрос. Как Flask обрабатывает переменные маршруты URL-адресов и параметры запроса?

      Ответ. В маршруте можно пометить любую переменную с помощью , и Flask передаст эту переменную в функцию с помощью именованного аргумента в URL-адресе. Например, маршрут в форме /hello/ создает строковый аргумент name для функции. Параметры запроса доступны через свойство request.args , в частности, через метод request.args.get .

      # URL: /hello/?message=Have%20a%20nice%20day @app.route('/hello/') def hello(name): msg = request.args.get('message','') return "Hello " + name + "! "+ msg + "." 

      Чтобы изменить тип, установите для переменной префикс int , float , path (принимает символы косой черты для разграничения имен папок) и uuid . Дополнительные сведения см. в разделе Правила переменных в документации по Flask.

      Вопрос. Может ли Visual Studio создать файл requirements.txt из виртуального окружения после установки других пакетов?

      Ответ: Да. Разверните узел Окружения Python, щелкните свое виртуальное окружение правой кнопкой мыши и выберите команду Создать requirements.txt. Эту команду хорошо использовать периодически при изменении окружения и фиксировать изменения в файле requirements.txt в системе управления версиями вместе с любыми другими изменениями кода, которые зависят от этого окружения. Если вы настроили непрерывную интеграцию на сервере сборки, каждый раз при изменении окружения необходимо создавать файл и фиксировать изменения.

      Шаг 1.5. Запуск проекта

      1. В Visual Studio выберите Отладка>Начать отладку (F5) или нажмите кнопку Веб-сервер на панели инструментов (браузер может отличаться): Run web server toolbar button in Visual Studio
      2. Любая из команд назначает случайный номер порта переменной среды PORT, а затем выполняет python app.py . Код запускает приложение, используя этот порт в пределах сервера разработки Flask. Если в Visual Studio отображается Не удалось запустить отладчик с сообщением об отсутствии файла запуска, в обозревателе решений щелкните правой кнопкой мыши файл app.py и выберите пункт Задать как файл запуска.
      3. При запуске сервера откроется окно консоли, в котором также отображается журнал сервера. Visual Studio автоматически открывает браузер на странице http://localhost: , где должно появиться сообщение, подготовленное к просмотру функцией hello : Flask project default view
      4. По окончании остановите сервер, закрыв консольное окно или используя команду Отладка>Остановить отладку в Visual Studio.

      Вопрос. В чем разница между использованием команд меню «Отладка» и команд сервера в подменю проекта Python?

      Ответ. В дополнение к командам меню Отладка и кнопкам панели инструментов вы также можете запустить сервер с помощью команд Python>Запуск сервера или Python>Запуск сервера отладки в контекстном меню проекта. Обе команды открывают окно консоли, в котором содержится локальный URL-адрес (localhost:port) для работающего сервера. Однако вы должны вручную открыть браузер с этим URL-адресом. При запуске сервера отладки отладчик Visual Studio не запускается автоматически. При желании вы можете присоединить отладчик к процессу позже с помощью команды Отладка>Присоединение к процессу.

      Следующие шаги

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

      Обработка данных входящих запросов в Flask

      Обработка данных входящих запросов в Flask

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

      В этом учебном модуле мы создадим приложение Flask с тремя маршрутами, которое будет принимать строки запросов, данные форм и объекты JSON.

      Предварительные требования

      Для данного обучающего руководства вам потребуется следующее:

      • Для данного проекта потребуется установить Python в локальной среде.
      • В этом проекте мы будем использовать инструмент Pipenv, предоставляющий отличные возможности упаковки для программирования на Python. Он предоставляет возможности Pipfile, pip и virtualenv в одной команде.
      • Для тестирования конечных точек API потребуется установить Postman или другой подобный инструмент.

      Для этого учебного модуля мы использовали версии Pipenv v2020.11.15, Python v3.9.0 и Flask v1.1.2.

      Настройка проекта

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

      Прежде всего, вам нужно будет создать каталог для проекта. Откройте терминал и запустите следующую команду:

      Затем перейдите в новый каталог:

      Затем установите Flask. Откройте терминал и запустите следующую команду:

      Команда pipenv создаст среду virtualenv для этого проекта, Pipfile, install flask и Pipfile.lock.

      Для активации virtualenv этого проекта запустите следующую команду:

      Чтобы получить доступ к входящим данным в Flask, вам нужно будет использовать объект request . В объекте request хранятся все входящие данные запроса, включая тип MIME, источник, IP-адрес, необработанные данные, метод HTTP, заголовки и т. д.

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

      Чтобы получить доступ к запрашиваемому объекту в Flask, вам потребуется импортировать его из библиотеки Flask:

      from flask import request 

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

      Используйте редактор кода для создания файла app.py . Импортируйте Flask и объект request . Также установите маршруты для query-example , form-example и json-example :

      # import main Flask class and request object from flask import Flask, request # create the Flask app app = Flask(__name__) @app.route('/query-example') def query_example(): return 'Query String Example' @app.route('/form-example') def form_example(): return 'Form Data Example' @app.route('/json-example') def json_example(): return 'JSON Object Example' if __name__ == '__main__': # run app in debug mode on port 5000 app.run(debug=True, port=5000) 

      Затем откройте терминал и запустите приложение с помощью следующей команды:

      Приложение будет запущено на порту 5000, чтобы вы могли просмотреть каждый маршрут в браузере, используя следующие ссылки:

      http://127.0.0.1:5000/query-example (or localhost:5000/query-example) http://127.0.0.1:5000/form-example (or localhost:5000/form-example) http://127.0.0.1:5000/json-example (or localhost:5000/json-example) 

      Код устанавливает три маршрута, и при открытии каждого маршрута вы увидите сообщения «Query String Example» , «Form Data Example» и «JSON Object Example» .

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

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

      Строка запроса выглядит следующим образом:

      example.com?arg1=value1&arg2=value2 

      Строка запроса начинается после знака ( ? ) вопроса:

      example.com?arg1=value1&arg2=value2 

      В ней содержатся пары ключ-значение, разделенные символом амперсанда ( & ):

      example.com?arg1=value1&arg2=value2 

      В каждой паре после ключа идет знак равенства ( = ), а затем идет значение.

      arg1 : value1 arg2 : value2 

      Строки запросов полезны для передачи данных, которые не требуют действий со стороны пользователя. Вы можете сгенерировать строку запроса в своем приложении и добавить ее к URL так, чтобы при запросе пользователя данные передавались автоматически. Строка запроса также может быть сгенерирована формами, использующими метод GET.

      Давайте добавим строку запроса в маршрут query-example . В этом гипотетическом примере, мы укажем имя языка программирования, которое будет отображаться на экране. Создайте ключ «language» и значение «Python» :

      http://127.0.0.1:5000/query-example?language=Python 

      Если вы запустите приложение и перейдете к этому URL, вы увидите сообщение «Query String Example» .

      Вам нужно будет программировать часть, обрабатывающую аргументы запроса. Этот код считает ключ language , используя request.args.get(‘language’) или request.args[‘language’] .

      При вызове request.args.get(‘language’) приложение продолжит работу, если ключ language отсутствует по указанному URL. В этом случае данный метод будет иметь результат None .

      При вызове request.args[‘language’] приложение возвращает ошибку 400, если ключ language отсутствует по указанному URL.

      При работе со строками запросов, рекомендуется использовать request.args.get() , чтобы предотвратить возможные сбои в работе приложения.

      Давайте прочитаем ключ language и выведем его.

      Измените маршрут query-example в app.py с помощью следующего кода:

      @app.route('/query-example') def query_example(): # if key doesn't exist, returns None language = request.args.get('language') return '''

      The language value is: <>

      '''
      .format(language)

      Затем запустите приложение и перейдите к URL:

      http://127.0.0.1:5000/query-example?language=Python 

      Браузер должен вывести следующее сообщение:

      Output
      The language value is: Python

      Аргумент из URL привязывается к переменной language , а затем возвращается через браузер.

      Чтобы добавить дополнительные параметры запроса, вы можете добавить амперсанды и новые пары ключ-значение в конце URL. Создайте ключ «framework» и значение «Flask» :

      http://127.0.0.1:5000/query-example?language=Python&framework=Flask 

      Если вам нужно больше, продолжайте добавлять амперсанды и пары ключ-значение. Создайте ключ «website» и значение «DigitalOcean» :

      http://127.0.0.1:5000/query-example?language=Python&framework=Flask&website=DigitalOcean 

      Чтобы получить доступ к этим значениям, мы все равно используем request.args.get() или request.args[] . Давайте используем оба варианта, чтобы продемонстрировать, что произойдет при отсутствии ключа. Измените маршрут query_example , чтобы назначить значение результатов переменным и вывести их:

      @app.route('/query-example') def query_example(): # if key doesn't exist, returns None language = request.args.get('language') # if key doesn't exist, returns a 400, bad request error framework = request.args['framework'] # if key doesn't exist, returns None website = request.args.get('website') return '''  

      The language value is: <>

      The framework value is: <>

      The website value is: <>'''.format(language, framework, website)

      Затем запустите приложение и перейдите к URL:

      http://127.0.0.1:5000/query-example?language=Python&framework=Flask&website=DigitalOcean 

      Браузер должен вывести следующее сообщение:

      Output
      The language value is: Python The framework value is: Flask The website value is: DigitalOcean

      Удалите ключ language из URL:

      http://127.0.0.1:5000/query-example?framework=Flask&website=DigitalOcean 

      Браузер должен вывести следующее сообщение со словом None , если для language будет отсутствовать значение:

      Output
      The language value is: None The framework value is: Flask The website value is: DigitalOcean

      Удалите ключ framework из URL:

      http://127.0.0.1:5000/query-example?language=Python&website=DigitalOcean 

      Браузер должен вывести сообщение об ошибке, потому что он ожидает получить значение framework :

      Output
      werkzeug.exceptions.BadRequestKeyError werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand. KeyError: 'framework'

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

      Использование данных форм

      Данные форм поступают из форм, отправленных на маршрут в виде запроса POST. Вместо отображения данных в URL (кроме случаев отправки форм в виде запроса GET) данные форм передаются приложению незаметно. Хотя вы не видите передаваемые данные форм, ваше приложение может их считывать.

      Чтобы продемонстрировать это, давайте изменим маршрут form-example в app.py так, чтобы принимать запросы GET и POST и возвращать форму:

      # allow both GET and POST requests @app.route('/form-example', methods=['GET', 'POST']) def form_example(): return '''   form method="POST"> 
      Language:
      Framework:
      '''

      Затем запустите приложение и перейдите к URL:

      http://127.0.0.1:5000/form-example 

      Браузер должен отображать форму с двумя полями ввода: одно language и одно для framework , а также кнопку отправки.

      Важнее всего знать об этой форме то, что она выполняет запрос POST к тому же маршруту, который сгенерировал форму. Все ключи, которые считываются в приложении, поступают от атрибутов name в полях ввода формы. В этом случае language и framework являются именами полей ввода, и поэтому у вас будет доступ к ним в приложении.

      Внутри функции просмотра вам нужно будет проверить метод запроса: GET или POST. Если это запрос GET, вы можете вывести форму. В противном случае это запрос POST, и вам нужно обработать входящие данные.

      Измените маршрут form-example в app.py , добавив следующий код:

      # allow both GET and POST requests @app.route('/form-example', methods=['GET', 'POST']) def form_example(): # handle the POST request if request.method == 'POST': language = request.form.get('language') framework = request.form.get('framework') return '''  

      The language value is: <>

      The framework value is: <>

      '''
      .format(language, framework)
      # otherwise handle the GET request return '''
      Language:
      Framework:
      '''

      Затем запустите приложение и перейдите к URL:

      http://127.0.0.1:5000/form-example 

      Введите в поле language значение Python , а в поле framework — значение Flask . Затем нажмите кнопку Submit.

      Браузер должен вывести следующее сообщение:

      Output
      The language value is: Python The framework value is: Flask

      Теперь вы понимаете, как обрабатывать данные формы. Перейдем к следующему типу входящих данных.

      Использование данных JSON

      Данные JSON обычно создаются процессом, который вызывает маршрут.

      Пример объекта JSON:

       "language": "Python", "framework": "Flask", "website": "Scotch", "version_info":  "python": "3.9.0", "flask": "1.1.2" >, "examples": ["query", "form", "json"], "boolean_test": true > 

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

      Измените маршрут form-example в app.py , чтобы принимать запросы POST и игнорировать другие запросы, в частности GET:

      @app.route('/json-example', methods=['POST']) def json_example(): return 'JSON Object Example' 

      Для строк запросов и данных форм в этом учебном модуле мы использовали браузер, но для отправки объекта JSON мы используем Postman, чтобы отправлять персонализированные запросы в URL.

      Примечание. Если вам нужна помощь в навигации по интерфейсу Postman для отправки запросов, воспользуйтесь официальной документацией.

      Добавьте URL в Postman и измените тип на POST. На вкладке body переключитесь на raw и выберите JSON из раскрывающегося списка.

      Эти настройки необходимы, чтобы Postman мог правильно отправлять данные JSON и чтобы ваше приложение Flask понимало, что получает данные JSON:

      POST http://127.0.0.1:5000/json-example Body raw JSON 

      Затем скопируйте в поле ввода текста предыдущий пример JSON.

      Отправьте запрос. Вы должны получить ответ «JSON Object Example» . Это не так интересно, но это ожидаемо, потому что код для обработки ответа данных JSON еще нужно написать.

      Чтобы читать данные, вам нужно понимать, как Flask преобразует данные JSON в структуры данных Python:

      • Все объекты конвертируются в словари Python. в JSON соответствуют somedict[‘key’] , который возвращает значение в Python.
      • Массив в JSON конвертируется в список в Python. Поскольку синтаксис одинаковый, приведем список примеров: [1,2,3,4,5]
      • Значения в кавычках объекта JSON станут строками в Python.
      • Логические операторы true и false становятся True и False в Python.
      • Числа без кавычек становятся числами в Python.

      Теперь давайте поработаем с кодом, чтобы считывать входящие данные JSON.

      Вначале добавим все содержимое объекта JSON в переменную, используя request.get_json() .

      request.get_json() конвертирует объект JSON в данные Python. Давайте назначим данные входящего запроса в переменные и выведем их, внеся следующие изменения в маршрут json-example :

      # GET requests will be blocked @app.route('/json-example', methods=['POST']) def json_example(): request_data = request.get_json() language = request_data['language'] framework = request_data['framework'] # two keys are needed because of the nested object python_version = request_data['version_info']['python'] # an index is needed because of the array example = request_data['examples'][0] boolean_test = request_data['boolean_test'] return ''' The language value is: <> The framework value is: <> The Python version is: <> The item at index 0 in the example list is: <> The boolean value is: <>'''.format(language, framework, python_version, example, boolean_test) 

      Обратите внимание на процедуру доступа к элементам, находящимся не на верхнем уровне. Поскольку мы вводим вложенный объект, используется [‘version’][‘python’] . А [‘examples’][0] используется для доступа к индексу 0 в массиве example.

      Если объект JSON, отправленный с запросом, не имеет ключа, доступ к которому осуществляется через функцию view, запрос не будет выполняться. Если вы не хотите, чтобы запрос выдавал сбой при отсутствии ключа, вам нужно будет проверить наличие ключа, прежде чем пытаться получить к нему доступ.

      # GET requests will be blocked @app.route('/json-example', methods=['POST']) def json_example(): request_data = request.get_json() language = None framework = None python_version = None example = None boolean_test = None if request_data: if 'language' in request_data: language = request_data['language'] if 'framework' in request_data: framework = request_data['framework'] if 'version_info' in request_data: if 'python' in request_data['version_info']: python_version = request_data['version_info']['python'] if 'examples' in request_data: if (type(request_data['examples']) == list) and (len(request_data['examples']) > 0): example = request_data['examples'][0] if 'boolean_test' in request_data: boolean_test = request_data['boolean_test'] return ''' The language value is: <> The framework value is: <> The Python version is: <> The item at index 0 in the example list is: <> The boolean value is: <>'''.format(language, framework, python_version, example, boolean_test) 

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

      Output
      The language value is: Python The framework value is: Flask The Python version is: 3.9 The item at index 0 in the example list is: query The boolean value is: false

      Теперь вы должны понимать принципы обработки объектов JSON.

      Заключение

      В этом учебном модуле мы создали приложение Flask с тремя маршрутами, которое будет принимать строки запросов, данные форм и объекты JSON.

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

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

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

      Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

      Голосовалка на Flask

      Python

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

      Дополнительно к этой статье, вы можете следить за развитием приложения в этом репозитории.

      Давайте начнем с создания простого Flask-based приложения.

      Мы создали новую директорию и в ней создали такой скрипт на Python:

      examples/flask/poll1/poll.py

      from flask import Flask, render_template import os app = Flask(__name__) @app.route('/') def root(): return render_template('poll.html') if __name__ == "__main__": app.run(debug=True)

      Мы создали обработчик для / , который вызывает функцию root() . Эта функция возвращает страницу, собранную из шаблона poll.html . Сам шаблон находится в поддиректории templates/ .

      examples/flask/poll1/templates/poll.html

         Poll  

      Poll

      Сейчас директория нашего проекта выглядит вот так:

      $ tree . ├── poll.py └── templates └── poll.html

      Теперь мы можем запустить приложение командой python poll.py , которая скажет нам:

      * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat

      Если открыть браузер по полученному адресу, то мы увидим следующее:

      Flask poll

      Немного, но оно работает. Прям как hello world, но с шаблоном.

      $ git init $ git add . $ git commit -m "step 1 - hello world with a template"

      Отображение голосования

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

      poll_data =

      Мы также изменили вызов рендеринга шаблона render_template и теперь передаем туда наш словарь под ключом data .

      examples/flask/poll2/poll.py

      from flask import Flask, render_template import os app = Flask(__name__) poll_data = < 'question' : 'Which web framework do you use?', 'fields' : ['Flask', 'Django', 'TurboGears', 'web2py', 'pylonsproject'] >@app.route('/') def root(): return render_template('poll.html', data=poll_data) if __name__ == "__main__": app.run(debug=True)

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

      Затем мы создаем форму с action=»/poll»> , это значит, что мы должны создать новый обработчик для этого запроса в нашем приложении. Внутри формы мы создаем несколько элементов radio для ввода данных (выбора значений). По одному для каждого варианта ответа. Тип поля radio хорошо подходит, когда нам нужно получить ровно один ответ.

      examples/flask/poll2/templates/poll.html

      После всех этих изменений зайдем на нашу страницу, и вот что мы увидим:

      Flask poll

      Если выбрать один из элементов и нажать кнопку «Vote», то получим такой ответ:

      Flask poll

      Это значит, что мы еще не добавили обработчик для /poll . Давайте сделаем его.

      $ git add . $ git commit -m "add poll data and display it"

      Принимаем результаты голосования

      Первый шаг это добавление хендлера для обработки /poll , прием значения поля field формы с помощью request.args.get(‘field’) . Для начала, просто вернем выбранное значение пользователю:

      @app.route('/poll') def poll(): vote = request.args.get('field') return vote

      Мы можем перезагрузить страницу в браузере и увидим там выбранный нами вариант:

      Flask poll

      Следующий шаг — сохранение результатов. Для простоты мы будем использовать обычный файл. В начале скрипта poll.py мы добавим имя файла в виде переменной: filename = ‘data.txt’ (всегда хорошо иметь переменные для таких случаев), а затем открываем файл, чтобы добавить туда контент (используя ‘a’ в качестве аргумента для функции open ), записываем результат в файл и закрываем файл.

      Мы собираемся хранить по одному результату голосований в строке. Тогда будет легко собирать данные впоследствии.

      @app.route('/poll') def poll(): vote = request.args.get('field') out = open(filename, 'a') out.write( vote + '\n' ) out.close() return vote

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

      return render_template('thankyou.html', data=poll_data)

      Теперь Flask скрипт выглядит вот так:

      examples/flask/poll3/poll.py

      from flask import Flask, render_template, request import os app = Flask(__name__) poll_data = < 'question' : 'Which web framework do you use?', 'fields' : ['Flask', 'Django', 'TurboGears', 'web2py', 'pylonsproject'] >filename = 'data.txt' @app.route('/') def root(): return render_template('poll.html', data=poll_data) @app.route('/poll') def poll(): vote = request.args.get('field') out = open(filename, 'a') out.write( vote + '\n' ) out.close() return render_template('thankyou.html', data=poll_data) if __name__ == "__main__": app.run(debug=True)

      Шаблон страницы благодарности вот такой:

      examples/flask/poll3/templates/thankyou.html

         >  

      Thank you for submitting your vote for

      >
      $ git add poll.py templates/thankyou.html $ git commit -m "save the vote and thank the voter"

      Эта версия голосовалки уже работает, но давайте добавим еще одну страницу — с результатами голосования.

      Отображение результатов

      Для отображения результатов мы создадим еще один обработчик (для пути с именем /results ), который будет читать файл с данными и показывать количество голосов по каждому варианту.

      Вот наш обработчик:

      @app.route('/results') def show_results(): votes = <> for f in poll_data['fields']: votes[f] = 0 f = open(filename, 'r') for line in f: vote = line.rstrip("\n") votes[vote] += 1 return render_template('results.html', data=poll_data, votes=votes)

      Сначала мы создали словарь votes , куда собираемся собрать количество голосов. Затем мы идем по списку ожидаемых значений из исходного списка значений и создаем там элементы для каждого из них с количеством 0. Это будет гарантией, что каждый элемент из нашего списка вариантов представлен в результатах, даже есть за него никто не проголосовал.

      Затем мы открываем файл с данными для чтения и читаем построчно. Перед обновлением нашего словаря votes , мы должны удалить символы перевода строки с помощью line.rstrip(«\n») .

      Затем мы передаем собранные результаты голосований в функцию render_template .

      Шаблон выглядит вот так:

      examples/flask/poll4/templates/results.html

      и вот скрипт целиком:

      examples/flask/poll4/poll.py

      from flask import Flask, render_template, request import os app = Flask(__name__) poll_data = < 'question' : 'Which web framework do you use?', 'fields' : ['Flask', 'Django', 'TurboGears', 'web2py', 'pylonsproject'] >filename = 'data.txt' @app.route('/') def root(): return render_template('poll.html', data=poll_data) @app.route('/poll') def poll(): vote = request.args.get('field') out = open(filename, 'a') out.write( vote + '\n' ) out.close() return render_template('thankyou.html', data=poll_data) @app.route('/results') def show_results(): votes = <> for f in poll_data['fields']: votes[f] = 0 f = open(filename, 'r') for line in f: vote = line.rstrip("\n") votes[vote] += 1 return render_template('results.html', data=poll_data, votes=votes) if __name__ == "__main__": app.run(debug=True)

      Если мы перейдем по ссылке http://127.0.0.1:5000/results, то увидим такой ответ:

      Flask poll

      $ git add poll.py templates/results.html $ git commit -m "show the results"

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *