Flask – превосходный инструмент для создания веб-приложений на Python. Одним из важных аспектов разработки является создание и обработка форм, позволяющих пользователю взаимодействовать с приложением. В данной статье мы рассмотрим, как создавать и обрабатывать формы с помощью Flask.
Создание HTML-формы
Для начала создадим простую HTML-форму в шаблоне Jinja2. В каталоге «templates» создаем файл «login.html»:
<form action="{{ url_for('login') }}" method="POST">
<label for="username">Имя пользователя:</label>
<input type="text" name="username" id="username" required>
<br>
<label for="password">Пароль:</label>
<input type="password" name="password" id="password" required>
<br>
<input type="submit" value="Войти">
</form>
Здесь мы создали форму с двумя полями: имя пользователя и пароль, а также кнопкой для отправки формы. Форма отправляется по адресу, указанному в функции url_for().
Создание маршрута для отображения формы
Следующим шагом создадим маршрут во Flask для отображения страницы с формой. В файле приложения добавляем:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
Здесь мы создали маршрут ‘/login’ с поддержкой методов GET и POST. При запросе методом GET вернется страница с формой.
Обработка отправленной формы
Теперь нам необходимо обработать данные, отправленные пользователем. Для этого дополним функцию login():
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# Здесь производим проверку и аутентификацию пользователя
return f"Добро пожаловать, {username}!"
При получении запроса методом POST мы извлекаем данные из полей формы и обрабатываем их.
Использование Flask-WTF для работы с формами
Flask-WTF – это расширение для Flask, упрощающее работу с формами. Оно предоставляет классы и валидаторы для удобного создания и обработки форм. Пример использования Flask-WTF:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
class LoginForm(FlaskForm):
username = StringField('Имя пользователя', validators=[DataRequired()])
password = PasswordField('Пароль', validators=[DataRequired()])
submit = SubmitField('Войти')
Здесь мы создали класс LoginForm, унаследованный от FlaskForm, и определили поля для имени пользователя, пароля и кнопки отправки. Валидатор DataRequired() гарантирует, что поля не будут пустыми.
Интеграция Flask-WTF в приложение
Теперь интегрируем нашу форму на основе Flask-WTF в приложение. В шаблоне «login.html» вставим код для отображения формы:
{% from "wtforms_macros.html" import render_field %}
<form action="{{ url_for('login') }}" method="POST">
{{ render_field(form.username, label="Имя пользователя:") }}
<br>
{{ render_field(form.password, label="Пароль:") }}
<br>
{{ form.submit }}
</form>
Затем в функции login() создадим экземпляр формы и обновим обработчик запросов:
from flask import Flask, render_template, request, flash
from .forms import LoginForm
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if request.method == 'POST' and form.validate_on_submit():
username = form.username.data
password = form.password.data
# Здесь производим проверку и аутентификацию пользователя
return f"Добро пожаловать, {username}!"
return render_template('login.html', form=form)
Теперь приложение использует Flask-WTF для работы с формой аутентификации. Функция form.validate_on_submit() проверяет, что форма была отправлена и прошла валидацию.
Заключение
Мы рассмотрели создание и обработку форм во Flask, включая использование расширения Flask-WTF для упрощения работы с формами. Теперь вы можете эффективно создавать и обрабатывать формы в своих веб-приложениях на Flask, предоставляя пользователям гибкие и безопасные способы взаимодействия с вашим приложением.