Обработка форм во Flask

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

Его необходимо дополнительно установить:
pip install flask-wtf




Расширение использует классы Python для представления веб-форм. Класс формы просто определяет поля формы как переменные класса.

Удобно также разделять логику приложения, сохраняя код форм в отдельном файле forms.py.

Пример форма входа пользователя

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember_me = BooleanField('Remember Me')
    submit = SubmitField('Sign In')
Класс формы
Класс формы должен наследоваться от класса формы, FlaskForm.

Для каждого поля формы создается объект, как переменная класса в LoginForm. Поля отвечают за отрисовку и преобразование данных. Они делегируют полномочия валидаторам для проверки данных. Класс подбирается согласно типу поля, в скобках указываются необходимые параметры и методы. Более подробно
Основные Параметры
  • label – метка поля.
  • validators — валидаторы проверки ввода.
  • filters — последовательность фильтров.
  • description — описание поля, используемое для текста справки.
  • id — идентификатор, используемый для поля. Устанавливается формой, и вам не нужно устанавливать его вручную.
  • default — значение по умолчанию, которое присваивается полю, если данные не введены.
  • widget — переопределяет виджет, используемый для отображения поля.
  • render_kw ( dict ) — словарь, содержащий ключевые слова по умолчанию, которые будут переданы виджету во время рендеринга.
  • name — HTML-имя этого поля. Значением по умолчанию является имя атрибута Python.
Подробнее о других параметрах смотреть документацию
классы Типов полей
StringField - текстовое поле (html-элемент text)
HiddenField - текстовое скрытое поле (html-элемент hidden).
PasswordField - текстовое скрытое поле (html-элемент password)
TextAreaField - текстовое поле для многострочного ввода (html-элемент textarea)
BooleanField - логическое поле статуса (html-элемент checkbox)
DateField - поле указания даты (html-элемент datetime)
DateTimeField - поле указания даты и времени
TimeField - поле указания времени
DecimalField- текстовое поле, которое приводится к Decimal
DecimalRangeField - текстовое поле, которое приводится к Decimal (html-элемент range)
EmailField - поле ввода электронной почты (html-элемент email)
TelField - текстовое поле для ввода телефона (html-элемент tel)
URLField - текстовое поле для указания url (html-элемент url)
FileField - отображает поле загрузки файла
MultipleFileField- отображает поле загрузки нескольких файлов
FloatField - текстовое поле, преобразует введенные данные к числу с плавающей точкой.
IntegerField - текстовое поле, преобразует введенные данные к целому числу.
IntegerRangeField - текстовое поле, преобразует введенные данные к целому числу (html-элемент range).
RadioField - список полей переключателей (html-элемент radio)
SelectField - поле выбора из введенных значений. Поле choices.
SelectMultipleField - поле выбора из введенных значений. Позволяет выбрать несколько элементов Поле choices.
SearchField - поле поиска (html-элемент search)
SubmitField - кнопка
Добавление формы в HTML
Следующим шагом является добавление формы в HTML-шаблон. Поля, определенные в LoginForm классе, умеют отображать себя как HTML элементы. Поэтому достаточно указать обращение к определенному объекту формы.

Шаблон ожидает объект формы, созданный из LoginForm класса. Данный объект передается при создании представления страницы как параметр.
Атрибут action формы используется для указания браузеру URL-адреса, который используется при отправке информации, введенной пользователем в форму. Когда для действия задана пустая строка, форма отправляется на URL-адрес текущей страницы.

Атрибут method указывает метод HTTP-запроса, который следует использовать при отправке формы на сервер.

Аргумент form.hidden_tag() шаблона создает скрытое поле, содержащее токен, который используется для защиты формы от атак CSRF.
Форма входа

<h1>Форма входа</h1>
    <form action="" method="post" >
        {{ form.hidden_tag() }}
        <p>
            {{ form.username.label }}<br>
            {{ form.username(size=32) }}
        </p>
        <p>
            {{ form.password.label }}<br>
            {{ form.password(size=32) }}
        </p>
        <p>{{ form.remember_me() }} {{ form.remember_me.label }}</p>
        <p>{{ form.submit() }}</p>
    </form>
Представления формы
Импортируется LoginForm класс из forms.py , создается его экземпляр и указывается в функции отрисовки страницы.
Представление страницы

from flask import render_template
from app import app
from app.forms import LoginForm

# ...

@app.route('/login')
def login():
    form = LoginForm()
    return render_template('login.html', title='Sign In', form=form)