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

Во Flask обработка форм является распространённым требованием при создании веб-приложений.

Обработка данных формы включает получение, проверку и обработку форм, отправленных пользователем. Flask предоставляет базовые возможности обработки форм, но обычно он используется вместе с расширением Flask-WTF, чтобы упростить работу с формами и их проверку.

  1. Базовая обработка форм: Используйтеrequest.formПолучите данные формы.
  2. Используйте Flask-WTF: объедините WTForms для обработки форм и проверки, чтобы упростить операции с формами.
  3. Проверка форм: используйте валидаторы, чтобы гарантировать корректность данных формы.
  4. Загрузка файлов: Обработка загрузки файлов и сохранение файлов.
  5. Защита от CSRF: Обеспечьте защиту форм от атак Cross-Site Request Forgery.

1. Базовая обработка форм

Flask предоставляет прямой способ обработки данных формы, используя объект request для получения отправленных данных.

Создание HTML-формы

Код файла templates/form.html:

Пример

<!DOCTYPE html>
<html>
<head>
    <title>Пример формы</title>
</head>
<body>
    <form action="/submit" method="post">
        <label for="name">Название:</label>
        <input type="text" id="name" name="name">
        <br>
        <label for="email">Эл. почта:</label>
        <input type="email" id="email" name="email">
        <br>
        <input type="submit" value="Отправить">
    </форма>
</body>
</html>

action="../submit": Данные формы отправляются по пути /submit.

method="post": Используйте метод POST для отправки данных.

Обработка данных формы

Код файла app.py:

Пример

from flask import Flask, render_template, request

app = Flask(__name__)

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

@app.route('/submit', methods=['POST'])
def submit():
    name = request.form.get('name')
    email = request.form.get('email')
    return f'Имя: {name}, Email: {email}'

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

request.form.get('name')andrequest.form.get('email'): Получение отправленных данных формы.

2. Использование расширения Flask-WTF

Flask-WTF — это расширение, которое оборачивает WTForms, предоставляя функциональность обработки и валидации форм, делая обработку форм более лаконичной и мощной.

Установка Flask-WTF

pip install flask-wtf
Настройка Flask-WTF

Код файла app.py:

Пример

from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, EmailField, SubmitField
from wtforms.validators import DataRequired, Email

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # Требуется для защиты формы

class MyForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    email = EmailField('Email', validators=[DataRequired(), Электронная почта()])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET', 'POST'])
def form():
    form = MyForm()
    if form.validate_on_submit():
        name = form.name.data
        email = form.email.data
        return f'Имя: {name}, Email: {email}'
    return render_template('form.html', form=form)

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

Создайте шаблоны для поддержки форм Flask-WTF.

Код файла templates/form.html:

Пример

<!DOCTYPE html>
<html>
<head>
    <title>Пример формы</title>
</head>
<body>
    <form method="post">
        {{ form.hidden_tag() }}
        <div>
            {{ form.name.label }}<br>
            {{ form.name(size=32) }}
        </div>
        <div>
            {{ form.email.label }}<br>
            {{ form.email(size=32) }}
        </div>
        <div>
            {{ form.submit() }}
        </div>
    </форма>
</body>
</html>

{{ form.hidden_tag() }}: Сгенерируйте скрытое поле для защиты формы от CSRF-атак.

{{ form.name.label }}и{{ form.name(size=32) }}: Отображает поля формы и их метки.

3. Валидация формы

Flask-WTF и WTForms предоставляют богатые возможности проверки форм. Вы можете использовать встроенные валидаторы или пользовательские валидаторы, чтобы обеспечить корректность данных формы.

Пример

from wtforms import Form, StringField, EmailField, SubmitField
from wtforms.validators import DataRequired, Email, Длина

class MyForm(FlaskForm):
    name = StringField('Name', validators=[
        DataRequired(), Length(min=1, max=50)
    ])
    email = EmailField('Email', validators=[
        DataRequired(), Email()
    ])
    submit = SubmitField('Submit')
  • DataRequired(): Проверяет, что поле не пустое.
  • Length(min=1, max=50): Ограничивает минимальную и максимальную длину строки.
  • Email(): Проверяет, является ли поле допустимым адресом электронной почты.

4. Загрузка файлов

Flask также поддерживает обработку загрузки файлов. Загруженные файлы можно получить черезrequest.filesПосетите.

Создание формы загрузки файла

код файла templates/upload.html:

Пример

<!DOCTYPE html>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <label for="file">Файл:</label>
        <input type="file" id="file" name="file">
        <br>
        <input type="submit" value="Загрузить">
    </форма>
</body>
</html>

enctype="multipart/form-data": Укажите тип кодирования данных формы для поддержки загрузки файлов.

Обработка загрузки файлов

Код файла app.py:

Пример

from flask import Flask, request, redirect, url_for

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/upload', methods=['POST'])
def upload():
    file = request.files.get('file')
    if file:
        filename = file.filename
        file.save(f'uploads/{filename}')
        return f'Файл успешно загружен: {filename}'
    return 'Файл не загружен'

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

request.files.get('file'): Получить объект загруженного файла.

file.save(f'uploads/{filename}')Сохранить файл в указанный каталог.

5. Защита от CSRF

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

Настройка защиты CSRF

app.secret_key = 'your_secret_key'

Добавьте CSRF-токен в шаблон:

Пример

<form method="post">
    {{ form.hidden_tag() }}
    <!-- Поля формы здесь -->
</форма>
Другие расширения