Обработка форм во Flask
Во Flask обработка форм является распространённым требованием при создании веб-приложений.
Обработка данных формы включает получение, проверку и обработку форм, отправленных пользователем. Flask предоставляет базовые возможности обработки форм, но обычно он используется вместе с расширением Flask-WTF, чтобы упростить работу с формами и их проверку.
- Базовая обработка форм: Используйте
request.formПолучите данные формы. - Используйте Flask-WTF: объедините WTForms для обработки форм и проверки, чтобы упростить операции с формами.
- Проверка форм: используйте валидаторы, чтобы гарантировать корректность данных формы.
- Загрузка файлов: Обработка загрузки файлов и сохранение файлов.
- Защита от CSRF: Обеспечьте защиту форм от атак Cross-Site Request Forgery.
1. Базовая обработка форм
Flask предоставляет прямой способ обработки данных формы, используя объект request для получения отправленных данных.
Создание HTML-формы
Код файла templates/form.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:
Пример
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_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:
Пример
<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.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:
Пример
<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:
Пример
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.hidden_tag() }}
<!-- Поля формы здесь -->
</форма>